2013-05-03 5 views
1

Я пытаюсь написать этот select в LINQ, но Im не удалось исправить его в течение длительного времени. Я также пробовал LINQ - join with Group By and get average, но он не работает в моем коде. Очевидно, я ошибаюсь.LINQ - multi join with Group by и получить среднее значение

SQL:

SELECT name_type, AVG(t.price) as avgPrice FROM type tp 
JOIN location l ON l.ID_type = tp.ID 
JOIN event e ON e.ID_location = l.ID 
JOIN ticket t ON t.ID_event = e.ID 
GROUP BY tp.name_type 

LINQ:

var q3 = from l in db.location 
join tp in db.type on l.ID_type equals tp.ID 
join e in db.event on l.ID equals u.ID_location 
join t in db.ticket on e.ID equals t.ID_event 
group tp by new {Type_name = tp.type_name} into grp 
select new 
{ 
    Type_name = grp.Key.type_name, 
    avgPrice = grp.Average(x => x.ticket.price) 
}; 

ответ

3

Есть несколько проблем:

  1. Существует ошибка во втором присоединиться к — Я считаю u.ID_location потребности быть e.ID_location ,
  2. Я думаю, что вы группируете неправильное сущность, попробуйте сгруппировать по t вместо tp.
  3. Вам не нужен анонимный тип в group by.

Попробуйте это:

var results = 
    from l in db.location 
    join tp in db.type on l.ID_type equals tp.ID 
    join e in db.event on l.ID equals e.ID_location 
    join t in db.ticket on e.ID equals t.ID_event 
    group t by new tp.type_name into grp 
    select new 
    { 
      Type_name = grp.Key, 
      avgPrice = grp.Average(x => x.price) 
    }; 

Если вам посчастливилось иметь навигационные свойства, установленные между вашими лицами, это было бы намного проще. Это очень трудно сказать, как субъекты предполагается быть связаны, но я думаю, что-то, как это будет работать:

// average ticket price per location type 
var results = 
    from t in db.ticket 
    group t by t.event.location.type.type_name into g 
    select new 
    { 
     Type_name = g.Key, 
     avgPrice = g.Average(x => x.price) 
    }; 

Или беглом синтаксисом:

var results = db.ticket.GroupBy(t => t.event.location.type.type_name) 
         .Select(g => new 
           { 
            Type_name = g.Key, 
            avgPrice = g.Average(x => x.price) 
           }); 
+0

Спасибо Су много! Он отлично работает :) Теперь я могу попробовать попробовать более сложные варианты ... – Matwosk