Linq to SQL .Sum() without group ... into
Posted
技术标签:
【中文标题】Linq to SQL .Sum() without group ... into【英文标题】: 【发布时间】:2010-10-13 02:29:46 【问题描述】:我有这样的事情:
var itemsInCart = from o in db.OrderLineItems
where o.OrderId == currentOrder.OrderId
select new o.OrderLineItemId, ..., ..., o.WishListItem.Price
有什么办法吗
itemsCart.Sum() //not sure what to pass into the function
要获取 o.WishListItem.Price 的总和,还是我必须从数据库中获取另一个 iQueryable
【问题讨论】:
【参考方案1】:你可以:
itemsCart.Select(c=>c.Price).Sum();
只打一次数据库:
var itemsInCart = (from o in db.OrderLineItems
where o.OrderId == currentOrder.OrderId
select new o.OrderLineItemId, ..., ..., o.WishListItem.Price
).ToList();
var sum = itemsCart.Select(c=>c.Price).Sum();
节省的额外往返行程是值得的 :)
【讨论】:
无法将表达式 '(...).Select(o => o.Price).Sum()' 转换为 SQL 并且无法将其视为本地表达式。 试试 itemsCard.ToList().Select(c=>c.Price).Sum(); @rm 如果您仍然要获取信息,请按照 Jonathan 提到的方式进行操作(将列表保存在变量中,因此您只能获取一次数据)。 乔纳森 - 我会接受你的评论作为答案.. 如果你想要代表,你可以在这里发布:) @rm 更新版本只会访问数据库一次并且没有问题(而不是其他解决方案的两倍)【参考方案2】:试试:
itemsCard.ToList().Select(c=>c.Price).Sum();
其实这样会更好:
var itemsInCart = from o in db.OrderLineItems
where o.OrderId == currentOrder.OrderId
select new o.WishListItem.Price ;
var sum = itemsCard.ToList().Select(c=>c.Price).Sum();
因为您只会从数据库中检索一列。
【讨论】:
我需要其他列来处理其他事情,这就是我不想从数据库中获取另一个 IQueryable怎么样:
itemsInCart.AsEnumerable().Sum(o=>o.Price);
AsEnumerable 有所不同,此查询将在本地执行(Linq To Objects)。
【讨论】:
【参考方案4】:试试这个:
var itemsInCart = from o in db.OrderLineItems
where o.OrderId == currentOrder.OrderId
select o.WishListItem.Price;
return Convert.ToDecimal(itemsInCart.Sum());
我觉得更简单!
【讨论】:
【参考方案5】:我知道这是一个老问题,但你为什么不能这样做:
db.OrderLineItems.Where(o => o.OrderId == currentOrder.OrderId).Sum(o => o.WishListItem.Price);
我不确定如何使用查询表达式来做到这一点。
【讨论】:
这将是空引用错误如果没有找到行,所以你必须使用 .AsEnumerable().Sum(o=>o.Price) @EugeneBosikov 正如在其他答案中所指出的那样,添加AsEnumerable
将导致 LINQ 从服务器检索整个数据集并在本地聚合它,这比让数据库执行效率低得多工作。此外,LINQ 的工作方式不会出现空引用错误,因为它正在构建执行路径,并且在将结果输出到新集合之前实际上不会做任何工作。以上是关于Linq to SQL .Sum() without group ... into的主要内容,如果未能解决你的问题,请参考以下文章
将包含 where、group by、sum 和必须的 MySQL 语句转换为 Linq to Sql
LINQ to SQL语句Count/Sum/Min/Max/Avg操作符
LINQ to SQL语句之Select/Distinct和Count/Sum/Min/Max/Avg (转)