【问题标题】:Linq query to get all items with an average rating scoreLinq查询以获取具有平均评分的所有项目
【发布时间】:2021-08-09 22:22:01
【问题描述】:

我有一个与 1+ 个 rating 实体相关的 event 实体。我需要查询我的数据库以仅获取(例如)在此特定事件的总评分中平均评分为 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 个评分相关,如下所示:

编号:1 率 1:3 率 2:2 率 3:5 率 4:1

编号:2 评分 1:4 率 2:1 率 3:0 率 4:1

编号: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 的事件?

【问题讨论】:

    标签: linq entity-framework-core


    【解决方案1】:

    是的,从技术上讲。

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

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

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

    【讨论】:

    • 每个评级(1、2、3、4)针对不同的方面(例如:Rate1 代表“全球体验”,Rate2 代表“设施”,...)。您在此处发布的代码对我帮助很大。我只是用 Math.Round( ...Average..., 0) 包围
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-26
    • 1970-01-01
    • 2017-06-22
    • 1970-01-01
    • 2014-02-11
    • 2016-08-04
    相关资源
    最近更新 更多