Pergunta

How would this query using an inner join, left outer join, group by and two counts be converted 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;

This is what I have done so far:

            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)
                };
Foi útil?

Solução

You need to group using an anonymous class. This will allow you to access all your tables in your select statement

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

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

This can be written by first selecting the f.CriterionID column, Distinct(), Count()

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

SQL: COUNT(r.ChoiceID)

Response = grouped.Select(x => x.rf.ChoiceID).Count()
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top