0

我正在尝试使用 LINQ to SQL 对从 WCF 服务返回的结果集中的一行求和。我可以将 LINQ 用于基本选择、排序、过滤等。到目前为止一切都很好。

但是,当我尝试 Group By / Sum 时,我在尝试从下面的查询中获取(5)时收到错误消息“值不能为空”。(results是非空的并且有 1000+s 的项目,但是query当我们尝试返回它时它是空的:)

编辑:我已经删除了下面答案中提到的无效演员表,而是将聚合结果选择到按订单编写的自定义类中。现在页面运行没有错误——但是 group by / sum 不起作用....我只得到结果中的前五个最高值,而不是按组求和。为什么?

var query = (from h in results
            group h by h.Order into hh                     
            select new TopOrders()
            {
                Order = hh.Key,
                Total= hh.Sum(r => r.Price)
            }).OrderByDescending(i => i.Total);

return query.Take(5).ToList();

我可以指出的唯一可能的皱纹是 Order 本身就是一个集合(OrderID、OrderName 等),所以我尝试在 hh.Key.Order.OrderID 等上明确分组,但没有效果。

你能看到我遗漏了什么吗?谢谢。

4

1 回答 1

3

可能r.Price有几个订单是空的,所以使用Sum(r => r.Price ?? 0). 但在不知道您的数据的情况下,这有点猜测。

编辑 很明显,我忽略了它:您尝试将匿名类型的 IEnumerable 强制转换为List<TopOrders>,这是不可能的。但是,如果演员表无效,则as运算符会产生。null所以query本身就是null!要么删除强制转换,要么创建TopOrders 而不是匿名类型。

于 2012-10-21T15:50:19.227 回答