我想知道是否可以使用lambda表达式根据嵌套项目列表的平均值来排序项目列表。
在项目方面,我有一个产品清单,每个产品都可以有很多评论。我想根据每个产品的评论列表中的平均评分来订购产品列表。
我有这个:
products = category.Products.OrderBy(i => i.Reviews.Average(x => x.Rating));
这种构建没有问题,但是当我运行它时,它会返回一个错误,表示
序列不包含任何元素
是否可以使用lambda表达式执行此操作?
答案 0 :(得分: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));
答案 1 :(得分:2)
您的某个产品可能没有评论。你应该决定给它什么评级,让我们说99,因为你希望它出现在最后,所以:
category.Products.OrderBy(p=>p.Reviews.Count > 0 ?
p.Reviews.Average(r=>r.Rating) : 99);