【发布时间】:2018-08-21 01:25:24
【问题描述】:
我用多个 JOIN(包括一个 LEFT JOIN)编写了这个 SQL 请求。
它给了我预期的结果。
SELECT DISTINCT c.Id,
c.Title,
COUNT(v.Id) AS 'Nb_V2',
COUNT(DISTINCT v.IdUser) AS 'Nb_V1',
r.cnt AS 'Nb_R'
FROM TABLE_C c
JOIN TABLE_V v on c.Id = v.Id
LEFT JOIN (
SELECT Id, COUNT(*) AS cnt
FROM TABLE_R
GROUP BY Id
) r ON c.Id = r.Id
WHERE c.IdUser = '1234'
GROUP BY c.Id, c.Title, r.cnt
但是,'我喜欢这个请求的 Linq 等价物,把它放在我的应用程序的数据访问层。
我试过类似的东西:
var qResult = from c in dbContext.TABLE_C
join v in dbContext.TABLE_V on c.IdC equals v.IdC
join r in dbContext.TABLE_R on v.IdC equals r.IdC into temp
from x in temp.DefaultIfEmpty()
group x by new { c.IdC, c.Title /*miss something ?*/} into grouped
select new
{
IdC = grouped.Key.IdC, --good result
Title = grouped.Key.Title, --good result
NbR = grouped.Distinct().Count(t => t.IdC > 0), --good, but "t.Id > 0" seems weird
Count = --I'm lost. No idea how to get my COUNT(...) properties (Nb_V1 and Nb_V2)
};
我试图适应this SO question,但我想不通。我迷失了分组子请求中的Count。
谁能解释我哪里错了?
专业提示:如果有人可以使用 lambda 表达式编写等效项,则加分
【问题讨论】:
-
正确答案是——不要。 LINQ 不是 SQL 的替代品,它是一种基于 ORM 的语言。如果您需要在 LINQ 中执行 JOIN,则意味着您的 DbContext 缺少正确的关系。而不是加入你应该添加缺失的关系
-
而且 DbSet 不是表,它们是实体的存储库,彼此之间具有配置的关系,可以根据需要动态生成 JOIN。 DbContext 既不是数据库的连接也不是模型,它实际上是一个工作单元。
标签: sql linq join left-join sql-to-linq-conversion