我有以下LINQ条件where子句查询,它产生权重结果:
由此,我想取结果集并加入另一个表,tblPurchases
var result = weights.Join(getsuppliersproducts.tblPurchases,
w => new { w.MemberId, w.MemberName, w.LocationId, w.UnitId },
p => new { p.MemberId, p.MemberName, p.LocationId, p.UnitId },
(w, p) => p);
在第二个表中,我有两列我想要执行aggreagte函数,一个在PurchaseQuantity上的总和和一个UnitID的计数。
因此,在原始格式中,tblPurchases看起来如此:
MemberID LocationID UnitId SupplierID SupplierStatus Purchases
1 1 ab Sup1 Live 10
1 1 abc Sup1 Live 10
1 1 abcd Sup2 Dead 50
从我的结果数据集中,我希望输出看起来像这样:
MemberID LocationID SupplierID SupplierStatus UnitIdCount Total Purchases
1 1 Sup1 Live 2 50
另外,通过这些修改,我还可以将其归还给List吗?
如何使用LINQ实现此功能?我已经尝试过,并且悲惨地失败了。
(对于那些看过我以前的帖子的人,我试图涵盖所有角度,这样我就可以完全理解SQL和LINQ中发生的事情的概念)
答案 0 :(得分:1)
该查询将返回IEnumerable,其中每个Purchases与原始Weights查询中的MemberId,MemberName,LocationId和UnitId匹配。你一次只能轻松做一个聚合,所以
var result = weights.Join(getsuppliersproducts.tblPurchases,
w => new { w.MemberId, w.MemberName, w.LocationId, w.UnitId },
p => new { p.MemberId, p.MemberName, p.LocationId, p.UnitId },
(w, p) => p).ToList();
Int32 count = result.Count();
Double quantity = result.Sum(p => p.PurchaseQuantity);
这是你想要做的吗?
编辑,在您回复之后,我想用两个新列重新列出tblPurchases列表,即购买数量和单位ID数量之和。
这给出了平坦的输出:
var query = Weights.GroupJoin(
Purchases,
w => new {w.MemberId, w.LocationId},
p => new {p.MemberId, p.LocationId},
(w,p) => new {w.MemberId, w.LocationId, Count = p.Count(), Sum = p.Sum(x => x.Purchases)} );
请注意,在我们做的时候(w,p)=>新的{}表示w是单个权重而p是与该权重匹配的采购列表,因此您仍然可以保留所有(分层)数据:
var query = Weights.GroupJoin(
Purchases,
w => new {w.MemberId, w.LocationId},
p => new {p.MemberId, p.LocationId},
(w,p) => new {w.MemberId, w.LocationId, Count = p.Count(), Sum = p.Sum(x => x.Purchases), Purchases = p} );