[英]I can't Distinct, Sum, or Count from 3 tables with group clauses
I'm still learning linq, now i'm getting confused. 我仍在学习linq,现在我感到困惑。 I need data for report from 3 tables, I get the result, but it's duplicate.
我需要3个表中的数据作为报告,但得到的结果却是重复的。 I have used distinct but it's not working, n I need data to be sum still not working.
我使用了distinct,但是它不起作用,n我需要总和的数据仍然不起作用。
here is my table 这是我的桌子
TBL_MKN_MNM TBL_DETAIL TBL_TRANSACTION
ID_A Name Price Stock ID_B ID_A ID_C MANY ID_C DATE PAY
11 pepsi 2500 15 1 11 1234 1 1234 2013-05-22 6000
22 coca-cola 3000 16 2 22 1234 1 6666 2013-05-22 10000
3 11 6666 2
4 22 6666 1
the result I want
Name MANY PRICE AMOUNT LeftStock
Pepsi 3 2500 7500 12
Coca-Cola 2 3000 6000 14
Total 13500
Here is my query, can somebody explain what's wrong? 这是我的查询,有人可以解释这是什么问题吗?
var report= (from u in myDb.TBL_TRANSAKSI_MKN_MNMs.AsEnumerable()
where u.TGL_TRANSAKSI.Value.Date.Equals(dateTimePicker1.Value.Date)
join l in myDb.TBL_DETAIL_TRANSAKSIs.AsEnumerable() on u.ID_NOTA equals l.ID_NOTA
join m in myDb.TBL_MKN_MNMs.AsEnumerable() on l.ID_MKN_MNM equals m.ID_MKN_MNM
group new { u, l, m } by new { m.NAMA_MKN_MNM, m.HARGA_JUAL, u.TGL_TRANSAKSI, l.ID_MKN_MNM, u.USERNAME, l.Jumlah }
into grp
select new
{
MakanMinum = grp.Key.NAMA_MKN_MNM,
HargaJual = grp.Key.HARGA_JUAL,
Stok = grp.Sum(groupedthing => groupedthing.l.Jumlah),
Tanggal = grp.Key.TGL_TRANSAKSI,
Jumlah =(grp.Key.HARGA_JUAL * grp.Sum(groupedthing => groupedthing.l.Jumlah)),
Total = grp.Sum(grouptotal => grp.Key.HARGA_JUAL * grp.Sum(groupedthing => groupedthing.l.Jumlah)),
Username = grp.Key.USERNAME
}).Distinct();
1st: you should not use anonymouse class as your query result. 第一:您不应使用匿名类作为查询结果。
2nd: you should use Enumerable.Distinct<TSource> Method (IEnumerable<TSource>, IEqualityComparer<TSource>)
instead of current Enumerable.Distinct<TSource> Method (IEnumerable<TSource>)
第二:您应该使用
Enumerable.Distinct<TSource> Method (IEnumerable<TSource>, IEqualityComparer<TSource>)
而不是当前的Enumerable.Distinct<TSource> Method (IEnumerable<TSource>)
see link: 见链接:
http://msdn.microsoft.com/en-us/library/bb338049.aspx http://msdn.microsoft.com/en-us/library/bb338049.aspx
here is my suggestion: 这是我的建议:
var report= (from u in myDb.TBL_TRANSAKSI_MKN_MNMs.AsEnumerable()
where u.TGL_TRANSAKSI.Value.Date.Equals(dateTimePicker1.Value.Date)
join l in myDb.TBL_DETAIL_TRANSAKSIs.AsEnumerable() on u.ID_NOTA equals l.ID_NOTA
join m in myDb.TBL_MKN_MNMs.AsEnumerable() on l.ID_MKN_MNM equals m.ID_MKN_MNM
group new { u, l, m } by new { m.NAMA_MKN_MNM, m.HARGA_JUAL, u.TGL_TRANSAKSI, l.ID_MKN_MNM, u.USERNAME, l.Jumlah }
into grp
select new MyClass
{
MakanMinum = grp.Key.NAMA_MKN_MNM,
HargaJual = grp.Key.HARGA_JUAL,
Stok = grp.Sum(x=>x.l.Jumlah),
Tanggal = grp.Key.TGL_TRANSAKSI,
Jumlah =(grp.Key.HARGA_JUAL * grp.Sum(x=>x.l.Jumlah)),
Total = grp.Sum(grouptotal => grp.Key.HARGA_JUAL * grp.Sum(x=>x.l.Jumlah)),
Username = grp.Key.USERNAME
}).Distinct(new MyClassComparer());
class MyClass
{
public int MakanMinum {get;set;}
pubic int HargaJual {get;set;}
...
}
class MyClassComparer : IEqualityComparer<MyClass>
{
public bool Equals(MyClass x, MyClass y)
{
if (Object.ReferenceEquals(x, y)) return true;
if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
return false;
return x.MakanMinum == y.MakanMinum && x.HargaJual= y.HargaJual;
}
public int GetHashCode(MyClass m)
{
if (Object.ReferenceEquals(m, null)) return 0;
return m.MakanMinum.GetHashCode()^ m.HargaJual.GetHashCode();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.