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 与 group ... into?

【问题讨论】:

【参考方案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 的全部原因【参考方案3】:

怎么样:

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:如何在没有分组的情况下进行聚合?

LINQ to SQL语句Count/Sum/Min/Max/Avg操作符

LINQ to SQL语句之Select/Distinct和Count/Sum/Min/Max/Avg (转)

LINQ to Sql 左外连接与 Group By 和 Have 子句

如何使用 SUM 计算将 SQL 转换为 Linq