如何从linq查询中获取两个和 总结
我有一份交易清单。使用Linq,我想在一次查询中从这个列表中获得成本和数量之和 分组 我的第一个想法是使用分组-但我没有真正想要分组的键,我只想要一个包含整个列表结果的组。所以,我碰巧有一个名为“Parent”的属性,它对于所有事务都是相同的,所以我用它来分组:如何从linq查询中获取两个和 总结,linq,Linq,我有一份交易清单。使用Linq,我想在一次查询中从这个列表中获得成本和数量之和 分组 我的第一个想法是使用分组-但我没有真正想要分组的键,我只想要一个包含整个列表结果的组。所以,我碰巧有一个名为“Parent”的属性,它对于所有事务都是相同的,所以我用它来分组: var totalCostQuery = (from t in Transactions where t.Status != GeneralStoreTransactionStatus.Inactive &&
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。我还没有听说过聚合,所以谢谢你,我还需要多读一点,但看起来这是应该做的。我不知道总和会忽略空值,这也很酷。