左外连接和多重计数 SQL to LINQ

Posted

技术标签:

【中文标题】左外连接和多重计数 SQL to LINQ【英文标题】:Left outer join and multiple counts SQL to LINQ 【发布时间】:2014-02-18 19:19:56 【问题描述】:

如何将这个使用内连接、左外连接、分组依据和两个计数的查询转换为 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)
                ;

【问题讨论】:

你试过什么?我给你一个提示,你使用WhereGroupBySelect 和两个Join。所有这些都非常直接地转化为 LINQ。 请向我们展示您到目前为止所拥有的东西——我们需要看到您已经付出了一些努力,并了解您到底在哪里卡住了。 【参考方案1】:

您需要使用匿名类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()

SQL:COUNT(r.ChoiceID)

Response = grouped.Select(x => x.rf.ChoiceID).Count()

【讨论】:

以上是关于左外连接和多重计数 SQL to LINQ的主要内容,如果未能解决你的问题,请参考以下文章

Linq to SQL 左外连接不是

LINQ to SQL 执行联合和左外连接

LINQ to SQL 左外连接

Linq To Sql 左外连接 - 过滤空结果

LINQ to Sql 左外连接与 Group By 和 Have 子句

使用 Linq to Sql 的左外连接结果问题