首页 > 解决方案 > 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 的事件?

标签: linqentity-framework-core

解决方案


是的,从技术上讲。

var eventsWithRatingOfExactlyTwo = Events
    .Where(e => (e.Ratings.Average(r => r.Rate1 + r.Rate2 + r.Rate3 + r.Rate4) / 4) == 2);

不过,我怀疑寻找准确评级的实用性:您可能希望寻找评级在给定范围内的项目。

我鼓励您也重新考虑您的域模型。是什么让这四个“Rate”如此特别,以至于您不可能再为每个评级添加另一个 Rate?这些可能应该表示为另一个表中的行,而不是该表中的列。


推荐阅读