LINQ中的聚合函数

时间:2010-09-06 10:22:57

标签: linq count sum aggregate-functions

我有以下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中发生的事情的概念)

1 个答案:

答案 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} );