左外连接和多重计数 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)
;
【问题讨论】:
你试过什么?我给你一个提示,你使用Where
、GroupBy
、Select
和两个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的主要内容,如果未能解决你的问题,请参考以下文章