【问题标题】:Linq to SQL .Sum() without group ... intoLinq 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?

【问题讨论】:

    标签: c# linq-to-sql .net-3.5


    【解决方案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 的工作方式不会出现空引用错误,因为它正在构建执行路径,并且在将结果输出到新集合之前实际上不会做任何工作。
        猜你喜欢
        • 2012-12-08
        • 2017-05-29
        • 1970-01-01
        • 1970-01-01
        • 2011-05-18
        • 1970-01-01
        • 1970-01-01
        • 2015-04-26
        • 2010-12-13
        相关资源
        最近更新 更多