C# 如何将linq与聚合、联接和分组方式一起使用
我试图通过id和名字来获得餐厅的平均评级 重新分配的数量 复习课C# 如何将linq与聚合、联接和分组方式一起使用,c#,linq,C#,Linq,我试图通过id和名字来获得餐厅的平均评级 重新分配的数量 复习课 public int ReviewId { get; set; } public double Rating { get; set; } [ForeignKey("ResterauntId")] Resteraunt Resteraunt { get; set; } public int ResterauntId { get; set; } publi
public int ReviewId { get; set; }
public double Rating { get; set; }
[ForeignKey("ResterauntId")]
Resteraunt Resteraunt { get; set; }
public int ResterauntId { get; set; }
public int ResterauntId { get; set; }
public string Name { get; set; }
public virtual ICollection<Review> Reviews { get; set; }
public virtual Review reviews{ get; set; }
重新安装类
public int ReviewId { get; set; }
public double Rating { get; set; }
[ForeignKey("ResterauntId")]
Resteraunt Resteraunt { get; set; }
public int ResterauntId { get; set; }
public int ResterauntId { get; set; }
public string Name { get; set; }
public virtual ICollection<Review> Reviews { get; set; }
public virtual Review reviews{ get; set; }
您需要按餐厅(id)分组,并平均每个餐厅的评分。由于LINQ有组联接,您只需使用
Join
即可获得分组:
var avgRatings = (from res in resteraunts
join rev in reviewsList on res.ResterauntId equals
rev.ResterauntId into revj
select new { res.ResterauntId, AveraRating = revj.Average(r => r.Rating) }).ToList();
仔细观察您的(部分)类,我发现您显然在使用实体框架,在这种情况下,您不需要手动加入:
var avgRatings = (from res in resteraunts
select new {
res.ResterauntId,
AveraRating = res.Reviews.Average(r => (double?)r.Rating)
}).ToList();
得益于@gnud,平均值有所提高。您知道
关键评级的类型吗?你明白为什么不能应用Average
?@NetMage它是一个双精度类型,因此没有double.Average
函数。如果你的InvalidOperationException说“物化值为空”,这是因为一些餐厅没有评论,因此没有平均值。将平均调用替换为revj.average(r=>(double?)r.Rating)
,没有任何平均值的调用将具有AverageRating==null
(如果您的评级为int,则转换为int?
)@gnud非常好<代码>评级
为双精度。