基于LINQ中的行数查找值的平均值
本文关键字:查找 平均值 LINQ 基于 | 更新日期: 2023-09-27 18:25:54
我有一个餐厅评论应用程序,它有一个单独的餐厅和评论表。我已经构建了一个MVC WebAPI,它有一个基于餐厅ID传递Restaurant对象的方法。
作为返回对象的一部分,我想添加一个平均评级值,该值基于在Reviews表上输入的评级值之和除以为餐厅Id输入的评论总数。
如果值是一个小数位的格式,那就太好了。
我可以使用以下代码从Reviews表中获得平均值(没有小数点)
var sum = (from a in db.Reviews
where a.ReviewsRestaurantID.Equals(id)
select a.ReviewsRating).Sum();
var count = (from a in db.Reviews
where a.ReviewsRestaurantID.Equals(id)
select a.ReviewsRating).Count();
decimal average = sum / count;
我不确定如何将值添加到我的查询中,该查询用于通过ID方法返回餐厅(请参见下文)。有人能帮助将自定义平均评分值添加到下面的方法中吗?或者有没有办法在评论表上进行连接,并更有效地计算值?
public IQueryable<Restaurant> GetRestaurantByID(int id)
{
var query = from a in db.Restaurants
where a.RestaurantID.Equals(id)
select a;
return query;
}
对于初学者来说,您可以真正减少代码+到服务器的流量。既然您提到了表、行和数据库,我猜您将使用某种SQL服务器。
首先从服务器上获取所有你关心的东西,即
var reviews = (from x in db.Reviews where a.ReviewsRestaurantID.Equals(id) select x).ToList();
现在,您不必两次单独访问服务器来收集您关心的数据。您只需对内存中的数据运行"平均"查询。。。
// Assuming, from your sample that the ratings are stored as decimals....
// This will do the counting, summing, dividing, etc.
decimal avg = (from x in reviews select x.Rating).Average();
var resReviews = from x in db.Restaurants
join y in db.Reviews on x.RestaurantID equals y.ReviewsRestaurantID into z
from a in z
group a by a.RestaurantID into g
select new {
RestaurantInfo = g.FirstOrDefault(),
RatingAverage = g.Average(x=>x.ReviewsRating)
};
您可以使用平均值:
var average = (from a in db.Reviews
where a.ReviewsRestaurantID.Equals(id)
select a.ReviewsRating).Average();
你也可以用这样的聚合来做(如果你真正想做的事情更复杂,这里有一个平均值的示例实现):
var result = db.Reviews.Where(r => r.ReviewsRestaurantID = id)
.Aggregate(new () { total = 0, count = 0, avg = 0.0 },
(o, n) => {
var result = new () { total = o.total+n.ReviewsRating, count = o.count+1, avg = 0.0};
result.avg = result.total / result.count;
return result;
}, (r) => r.avg);