2014-02-18 3 views
1

Как бы этот запрос, используя внутреннее соединение, левое внешнее соединение, группировать по и два счета, был преобразован в linq?Левое внешнее соединение и множественные подсчеты SQL to LINQ

SELECT 
    c.EndowmentID, 
    COUNT(DISTINCT f.CriterionID) AS RequiredCriteria, 
    COUNT(r.ChoiceID) AS Response 
FROM 
    Criteria c 
INNER JOIN 
    Filters f 
ON 
    c.ID = f.CriterionID 
LEFT OUTER JOIN 
    Responses r 
ON 
    f.ChoiceID = r.ChoiceID 
WHERE 
    f.IsRequirement = 1 
GROUP BY 
    c.EndowmentID; 

Это то, что я сделал до сих пор:

  var result = 
       from c in context.Criteria 
       join f in context.Filters on c.ID equals f.CriterionID 
       join r in context.Responses on f.ChoiceID equals r.ChoiceID into resfil 
       from rf in resfil.DefaultIfEmpty() 
       group rf by c.EndowmentID into grouped 
       select new 
       { 
        EndowmentID = grouped.Key, 
        Requirements = grouped.Count(t=>t.CriterionID), 
        Response = grouped.Count(t=>t.ChoiceID) 
       }; 
+0

Что вы пробовали? Я дам вам подсказку, вы используете 'Where',' GroupBy', 'Select' и два' Join''s. Все это переводится непосредственно в LINQ. – evanmcdonnal

+0

, пожалуйста, покажите нам, что у вас есть до сих пор - нам нужно увидеть, что вы приложили к нему какие-то усилия, и посмотрите, где именно вы застреваете. – user2366842

+0

ok Я только что обновил – Talley

ответ

0

Вы должны group используя анонимный класс. Это позволит вам получить доступ ко всем таблицам в вашем select заявления

group new { c, f, rf } by c.EndowmentID into grouped 

SQL: COUNT(DISTINCT f.CriterionID) AS RequiredCriteria,

Это может быть написано первым выбором f.CriterionID колонок, Distinct(), Count()

RequiredCriteria = grouped.Select(x => x.f.CriterionID).Distinct().Count() 

S QL: COUNT(r.ChoiceID)

Response = grouped.Select(x => x.rf.ChoiceID).Count() 
Смежные вопросы