0

我有一个餐厅评论应用程序,它有一个单独的餐厅和评论表。我已经构建了一个 MVC WebAPI,它具有一种基于餐厅 ID 传递 Restaurant 对象的方法。

作为返回对象的一部分,我想添加一个平均评分值,它基于在评论表中输入的评分值的总和除以餐厅 ID 输入的评论总数。

如果该值采用小数点后一位格式,那就太好了。

我可以使用以下代码从评论表中获取平均值(无小数位)

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; 
}
4

3 回答 3

3

对于初学者来说,你真的可以减少你的代码 + 到服务器的流量。既然你提到了表、行和数据库,我猜你会去一些 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();
于 2013-08-01T00:24:07.073 回答
2
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)
                 };
于 2013-08-01T00:20:53.037 回答
1

你可以只使用平均值:

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);
于 2013-08-01T00:11:15.403 回答