我想知道是否可以使用lambda表达式根据嵌套项目列表的平均值来排序项目列表.
在项目方面,我有一个产品列表,每个产品都可以有很多评论.我想根据每个产品的评论列表的平均评分来订购产品列表.
我有这个:
products = category.Products.OrderBy(i => i.Reviews.Average(x => x.Rating));
Run Code Online (Sandbox Code Playgroud)
这种构建没有问题,但是当我运行它时,它会返回一个错误
序列不包含任何元素
是否可以使用lambda表达式执行此操作?
Enumerable.Average抛出InvalidOperationException因为序列不包含任何元素,因为产品没有Reviews.
你可以使用Enumerable.DefaultIfEmpty(customValue):
products = category.Products
.OrderBy(i => i.Reviews.Select(r => r.Rating).DefaultIfEmpty(0).Average());
Run Code Online (Sandbox Code Playgroud)
也许您想从结果中排除这些产品:
products = category.Products
.Where(p => p.Reviews.Any())
.OrderBy(p => p.Reviews.Average(r => r.Rating));
Run Code Online (Sandbox Code Playgroud)