0

我想知道是否可以使用 lambda 表达式根据嵌套项目列表的平均值对项目列表进行排序。

在项目方面,我有一个产品列表,每个产品都可以有很多评论。我想根据每个产品的评论列表中的平均评分来订购产品列表。

我有这个:

products = category.Products.OrderBy(i => i.Reviews.Average(x => x.Rating));

这构建没有问题,但是当我运行它时,它返回一个错误,说

序列不包含任何元素

是否可以使用 lambda 表达式来做到这一点?

4

2 回答 2

6

Enumerable.Average抛出 ,InvalidOperationException因为序列不包含任何元素,因为产品没有Reviews.

你可以使用Enumerable.DefaultIfEmpty(customValue)

products = category.Products
    .OrderBy(i => i.Reviews.Select(r => r.Rating).DefaultIfEmpty(0).Average());

也许您想从结果中排除这些产品:

products = category.Products
    .Where(p => p.Reviews.Any())
    .OrderBy(p => p.Reviews.Average(r => r.Rating));
于 2013-01-16T21:55:48.127 回答
2

您的一种产品可能没有评论。你应该决定给它什么评级,比如说 99,因为你希望它出现在最后,所以:

category.Products.OrderBy(p=>p.Reviews.Count > 0 ?
                          p.Reviews.Average(r=>r.Rating) : 99);
于 2013-01-16T21:54:07.933 回答