如何从linq查询中获取两个和 总结

如何从linq查询中获取两个和 总结,linq,Linq,我有一份交易清单。使用Linq,我想在一次查询中从这个列表中获得成本和数量之和 分组 我的第一个想法是使用分组-但我没有真正想要分组的键,我只想要一个包含整个列表结果的组。所以,我碰巧有一个名为“Parent”的属性,它对于所有事务都是相同的,所以我用它来分组: var totalCostQuery = (from t in Transactions where t.Status != GeneralStoreTransactionStatus.Inactive &&

我有一份交易清单。使用Linq,我想在一次查询中从这个列表中获得成本和数量之和

分组 我的第一个想法是使用分组-但我没有真正想要分组的键,我只想要一个包含整个列表结果的组。所以,我碰巧有一个名为“Parent”的属性,它对于所有事务都是相同的,所以我用它来分组:

var totalCostQuery =
  (from t in Transactions
   where t.Status != GeneralStoreTransactionStatus.Inactive &&
   (t.Type == GeneralStoreTransactionType.Purchase ||
   t.Type == GeneralStoreTransactionType.Adjustment)
   group t by t.Parent into g
   select new
   {
     TotalCost = g.Sum(t => t.Cost.GetValueOrDefault()),
     TotalQuantity = g.Sum(t => t.Quantity.GetValueOrDefault())
   });
按t.Parent分组似乎可能是错误的。我真的不想分组,我只想要数量和成本的总和


这是获得两个不同属性之和的正确方法,或者可以采用不同的方法。

假设这是Linq to SQL或Entity Framework,您可以这样做:

var totalCostQuery =
  (from t in Transactions
   where t.Status != GeneralStoreTransactionStatus.Inactive &&
   (t.Type == GeneralStoreTransactionType.Purchase ||
   t.Type == GeneralStoreTransactionType.Adjustment)
   group t by 1 into g
   select new
   {
     TotalCost = g.Sum(t => t.Cost),
     TotalQuantity = g.Sum(t => t.Quantity)
   });
请注意,您不需要使用
GetValueOrDefault
,总和中将忽略空值

编辑:不确定这是否适用于Linq to NHibernate但是


请注意,如果使用Linq to对象,上述解决方案将不会有效,因为它将枚举每个组两次(每次求和一次)。在这种情况下,您可以使用
Aggregate

var transactions =
   from t in Transactions
   where t.Status != GeneralStoreTransactionStatus.Inactive &&
   (t.Type == GeneralStoreTransactionType.Purchase ||
   t.Type == GeneralStoreTransactionType.Adjustment)
   select t;

var total = 
    transactions.Aggregate(
        new { TotalCost = 0.0, TotalQuantity = 0 },
        (acc, t) =>
        {
            TotalCost = acc.TotalCost + t.Cost.GetValueOrDefault(),
            TotalQuantity = acc.TotalQuantity + t.Quantity.GetValueOrDefault(),
        });

您可以按常量值分组,例如
1
,而不是按t.Parent。这样你就只剩下一个小组了。顺便问一下,这是哪种口味的Linq?实体框架?Linq到对象?我对nHibernate返回的一些实体使用Linq。那么这个Linq到nHibernate吗?或者你已经有了一个包含结果的列表了吗?我已经有了一个列表,我只是在对我已经从数据库中获取的列表使用Linq。我还没有听说过聚合,所以谢谢你,我还需要多读一点,但看起来这是应该做的。我不知道总和会忽略空值,这也很酷。