我用多个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
但是,“ Id就像此请求的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)
};
我试图适应这个问题,但我无法弄清楚。我Count
对分组子请求的内部迷失了。
谁能解释我哪里错了?
专家提示:如果有人可以用lambda表达式编写等效项,则可获赠积分
要将SQL转换为LINQ查询理解:
DISTINCT
,TOP
,MIN
,MAX
等等)转换成适用于整个LINQ查询功能。new {
… )。}``groupby
First().field
从groupby
聚合范围变量获取非键值。JOIN``AND
在两个表之间进行多次ed相等测试的条件应转换为匿名对象,在每个对象的每一侧equals
JOIN
不是所有相等测试的条件都AND
必须使用where
联接外的子句或叉积(from
… from
…)然后使用来处理where
。如果要这样做LEFT JOIN
,请Where
在连接范围变量和DefaultIfEmpty()
调用之间添加一个lambda子句。LEFT JOIN
通过使用模拟into
joinvariable 做是另一回事from
了 joinvariable 其次.DefaultIfEmpty()
。COALESCE
为条件运算符(?:
)和一个null
测试。IN
来.Contains()
和NOT IN
到!
… Contains()
,使用文字阵列或恒定列表数组变量。BETWEEN
低 AND
高 到 低 <=
X &&
X <=
高 。CASE
,ISNULL
并IIF
以三元条件运算符?:
。SELECT *
必须用select range_variable替换,或者对于联接来说,是包含所有范围变量的匿名对象。SELECT
列必须替换为select new {
…}
创建具有所有所需字段或表达式的匿名对象。SELECT
可以通过重复表达式或let
在第一次使用表达式之前使用来命名对计算列的引用。FULL OUTER JOIN
必须使用扩展方法来正确处理。UNION
为,在这种情况下,您可以翻译为,而不必使用。Concat``DISTINCT``Union``DISTINCT
GROUP BY
使用单例来转换没有查询的聚合查询GroupBy
:添加.GroupBy(r => 1)
,然后在转换聚合函数Select
。EF.Functions``DbFunctions``EntityFunctions``DbFunctions
LIKE
使用(EF Core> = 2)EF.Functions.Like(column, pattern)
或(EF 6.x)转换SQL表达式DbFunctions.Like(column, pattern)
。将这些规则应用于SQL查询,您将获得:
var subrq = from r in Table_R
group r by r.Id into rg
select new { Id = rg.Key, cnt = rg.Count() };
var ansq = (from c in Table_C
join v in Table_V on c.Id equals v.Id
join r in subrq on c.Id equals r.Id into rj
from r in rj.DefaultIfEmpty()
where c.IdUser == "1234"
group new { c, v, r } by new { c.Id, c.Title, r.cnt } into cvrg
select new {
cvrg.Key.Title,
Nb_V2 = cvrg.Count(),
Nb_V1 = cvrg.Select(cvr => cvr.v.IdUser).Distinct().Count(),
Nb_R = (int?)cvrg.Key.cnt
}).Distinct();
lambda转换很棘手,但是需要LEFT JOIN
将GroupJoin
…转换为… SelectMany
:
var subr2 = Table_R.GroupBy(r => r.Id).Select(rg => new { Id = rg.Key, cnt = rg.Count() });
var ans2 = Table_C.Where(c => c.IdUser == "1234")
.Join(Table_V, c => c.Id, v => v.Id, (c, v) => new { c, v })
.GroupJoin(subr, cv => cv.c.Id, r => r.Id, (cv, rj) => new { cv.c, cv.v, rj })
.SelectMany(cvrj => cvrj.rj.DefaultIfEmpty(), (cvrj, r) => new { cvrj.c, cvrj.v, r })
.GroupBy(cvr => new { cvr.c.Id, cvr.c.Title, cvr.r.cnt })
.Select(cvrg => new { cvrg.Key.Title, Nb_V2 = cvrg.Count(), Nb_V1 = cvrg.Select(cvr => cvr.v.IdUser).Distinct().Count(), Nb_R = (int?)cvrg.Key.cnt });
问题内容: 我在SQL中有此查询,并且希望它使用Entity Framework 在LINQ中实现它,但是如何应用左外部联接的多个表? 问题答案: 这是使用LINQ实现左外部联接的方式。您应该使用GroupJoin(语法): 该查询联接了三个表。您可以以相同的方式加入其余表。
问题内容: 需要将三个表连接在一起。 进入一个表示要在我的视图中显示的对象的视图模型: 但是我在加入时遇到了问题: 还有另一种方法(如上所述)进行两个联接吗? 解决方案 基于方法的语法在这里是行不通的,必须与查询语法一起使用: 问题答案: 我假设您想加入UserHasPackages表,因为您想过滤特定用户的结果(我只是输入了’SomeUser’,因为我不确定’UserHasPackages.Ap
我想添加表示来自其他表的计数的列。 我有三张桌子。 消息 主题 STARS_GIVED 我想以: 主题回顾 所以基本上,我想附上3列唯一值的计数(每个主题中给出的星数,在主题中有消息的唯一用户,以及每个主题中唯一消息的数量)。 我希望最终能够对类别进行筛选(看看两列)。 此外,我希望最终按我加入的计数排序。例如,我将有一个按钮,按“星星的数目”按升序排序,或按“用户的数目”按降序排序,等等。 我试
问题内容: 大多数SQL方言都接受以下两个查询: 现在显然当您需要外部联接时,需要第二种语法。但是,在进行内部联接时,为什么我应该更喜欢第二种语法(反之亦然)? 问题答案: 在大多数现代数据库中,不赞成使用仅列出表并使用子句指定连接条件的旧语法。 这不仅是为了展示,当您在同一查询中同时使用INNER和OUTER联接时,旧语法可能会变得模棱两可。 让我给你举个例子。 假设您的系统中有3个表: 每个表
问题内容: 我有一个在SQL中完美运行的查询,但是我有最糟糕的时间将其转换为linq。该表(下面的表1)保存了多种记录类型的状态更改。联接需要设置两个字段以创建有效联接:SubmissionId(状态所属的表的pk)和SubmissionTypeId(确定状态所属的表)。 我已经尝试过使用x.DefaultIfEmpty()中的y到x进行多次迭代,并且无法在正确的位置设置where子句。我需要从T
问题内容: 我知道SQL Server中的联接。 例如。有两个表Table1,Table2。 它们的表结构如下。 表1的数据如下: 表2数据如下: 如果我执行下面提到的两个SQL语句,则两个输出将是相同的 请在上述SQL语句中说明左右联接之间的区别。 问题答案: Select * from Table1 left join Table2 … 和 确实是完全可以互换的。但是,请尝试(或同一对)进行区