2013-07-31 3 views
0

У меня есть приложение для просмотра ресторанов, в котором есть отдельная таблица ресторанов и обзоров. Я создал MVC WebAPI, который имеет способ передать объект ресторана на основе идентификатора ресторана.Поиск Среднее значение, основанное на подсчете строк в LINQ

В качестве части возвращаемого объекта я хотел бы добавить среднее значение оценки, которое основано на сумме значений рейтинга, внесенных в таблицу отзывов, разделенных на ресторан 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; 
} 

ответ

3

для начала, вы можете действительно урезать код + трафик на сервер. Поскольку вы упомянули таблицы, строки и db, я бы предположил, что вы собираетесь на какой-то SQL-сервер.

Start, получая все вещи вы заботитесь о с сервера, т.е.

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(); 
+0

Вы не ограничиваете его 'id' – Hogan

+0

Я не ограничиваю что? –

+0

А, я вижу, это было два вопроса ... неважно. – Hogan

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); 
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) 
       }; 
+0

Полностью пропущено Рестораны и отзывы разные в моем ответе. – Hogan

+0

@ Хоган, что вы подразумеваете под «пропущенными ресторанами»? Этот запрос возвращает всю информацию обо всех ресторанах, включая средние оценки, просто добавьте «где», чтобы получить конкретную информацию о ресторанах. –

+0

вы не читали мой комментарий - я сказал ** в своем ответе ** - и проголосовал за вас. – Hogan

Смежные вопросы