linq - Linq查询以获取具有平均评分的所有项目
问题描述
我有一个与 1+评级实体相关的事件实体。我需要查询我的数据库以仅获取(例如)在此特定事件的总评分中平均评分为 2 星的事件。Rate1, 2, 3, 4 的值可以在 [0,1,2,3,4,5] 星之间。
public class Event
{
public int Id { get; set; }
public string Title { get; set; }
public virtual List<Rating> Ratings { get; set; }
}
public class Rating
{
public int Id { get; set; }
public int Rate1 { get; set; }
public int Rate2 { get; set; }
public int Rate3 { get; set; }
public int Rate4 { get; set; }
public virtual Event Event { get; set; }
}
例如:1 个事件有 3 个相关的评级,如下所示:
ID:1 速率 1:3速率 2 :2 速率 3:5 速率 4:1
ID:2 速率 1:4速率 2 :1 速率 3:0 速率 4:1
ID:3速率 1: 3速率 2 :1 速率 3:3 速率 4:2
平均值计算如下: ( (3+2+5+1) + (4+1+0+1) + (3+1+3+2) ) / 12 = 2,16(四舍五入为 2)
我想知道是否可以编写一个 Linq 查询来获取所有被评为 2 的事件?
解决方案
是的,从技术上讲。
var eventsWithRatingOfExactlyTwo = Events
.Where(e => (e.Ratings.Average(r => r.Rate1 + r.Rate2 + r.Rate3 + r.Rate4) / 4) == 2);
不过,我怀疑寻找准确评级的实用性:您可能希望寻找评级在给定范围内的项目。
我鼓励您也重新考虑您的域模型。是什么让这四个“Rate”如此特别,以至于您不可能再为每个评级添加另一个 Rate?这些可能应该表示为另一个表中的行,而不是该表中的列。
推荐阅读
- c# - 使用单元素数组的 JSON.NET 自定义序列化
- python - 在具有多个参数的 pandas 数据帧上应用滚动函数
- flutter - Container BoxShadow 不适用于 InkWell 材料
- python - Headless Selenium 未使用 Chrome 驱动程序在 Python 中提取数据
- python - python在不使用for循环的情况下,与其他列表的嵌套列表的每个元素类似地查找
- android - 按下浮动操作按钮并单击地图时,Google Maps 检测到长按
- scala - 读取 Spark 属性文件
- python - 将列表元素“随机无重复”附加到多个 html 文件
- android - Android 错误:权限被拒绝:启动 Intent
- c++ - 如何对参数化模板函数进行类型推导