EF 核心 2.1 select/distinct
EF core 2.1 select/distinct
我正在使用 sql 分析器查看由 Ef core2.1 生成的 sql,
这是我的 linq 查询:
var resulat = (from a in A
join b in B equals a.level=b.level
where ...
select new M1 {AId = a.id}).Distinct();
(from r in resulat
join c in C equals r.AId = c.AId
select new M2
{
CId = c.Id,
level = _helper(c.level)
}).Distinct();
Sql生成:
select t.AId,c.Id,c.level
from
(
select distinct a.id
from A a
inner join B b on a.level=b.level
where ...
) as t
inner join C c on t.AId = c.AId
我想要的结果是:
select distinct c.Id,c.level
from
(
select distinct a.id
from A a
inner join B b on a.level=b.level
where ...
) as t
inner join C c on t.AId = c.AId
我也尝试过将 select/distinct 与结果 IQueryable 一起使用,但生成的 sql 是相同的。
我在我的 linq 查询中遗漏了什么,或者我必须添加什么才能拥有这个 sql 查询
这对我有用:
- 从 result 查询中删除 Distinct(),避免添加 t.AId 到我的选择。
- 从我的选择字段之一中删除辅助方法,执行将 Distinct() 添加到最终查询。
这是我修改后的查询:
var resulat = from a in A
join b in B equals a.level=b.level
where ...
select new M1 {AId = a.id};
(from r in resulat
join c in C equals r.AId = c.AId
select new M2
{
CId = c.Id
level = c.level
}).Distinct();
非常感谢您的评论,这对我很有帮助。
我一直热衷于直接从 table(嗯,DbSet)returns 数据中查询您想要的数据。该过程看起来有点像这些步骤:
- 我想要
C.Id
和 C.Level
- 那是
context.Cs
。
- 我想要哪个
C
?
- 具有父级
A
的那些,其中至少有一个 B
与 A
具有相同的 'level' 并且满足其他几个条件( where ...
).
总计:
from c in context.Cs
where context.Bs.Any(b => b.level == c.A.level && <other criteria>)
select new { c.Id, c.Level }
如果 where ...
还包含 A
的筛选条件,您可以将 && c.A == ...
之类的谓词添加到 where
。
请注意,我假设导航 属性 c.A
存在,否则将被创建,因为 C
具有 AId
.
我正在使用 sql 分析器查看由 Ef core2.1 生成的 sql, 这是我的 linq 查询:
var resulat = (from a in A
join b in B equals a.level=b.level
where ...
select new M1 {AId = a.id}).Distinct();
(from r in resulat
join c in C equals r.AId = c.AId
select new M2
{
CId = c.Id,
level = _helper(c.level)
}).Distinct();
Sql生成:
select t.AId,c.Id,c.level
from
(
select distinct a.id
from A a
inner join B b on a.level=b.level
where ...
) as t
inner join C c on t.AId = c.AId
我想要的结果是:
select distinct c.Id,c.level
from
(
select distinct a.id
from A a
inner join B b on a.level=b.level
where ...
) as t
inner join C c on t.AId = c.AId
我也尝试过将 select/distinct 与结果 IQueryable 一起使用,但生成的 sql 是相同的。 我在我的 linq 查询中遗漏了什么,或者我必须添加什么才能拥有这个 sql 查询
这对我有用:
- 从 result 查询中删除 Distinct(),避免添加 t.AId 到我的选择。
- 从我的选择字段之一中删除辅助方法,执行将 Distinct() 添加到最终查询。
这是我修改后的查询:
var resulat = from a in A
join b in B equals a.level=b.level
where ...
select new M1 {AId = a.id};
(from r in resulat
join c in C equals r.AId = c.AId
select new M2
{
CId = c.Id
level = c.level
}).Distinct();
非常感谢您的评论,这对我很有帮助。
我一直热衷于直接从 table(嗯,DbSet)returns 数据中查询您想要的数据。该过程看起来有点像这些步骤:
- 我想要
C.Id
和C.Level
- 那是
context.Cs
。 - 我想要哪个
C
? - 具有父级
A
的那些,其中至少有一个B
与A
具有相同的 'level' 并且满足其他几个条件(where ...
).
总计:
from c in context.Cs
where context.Bs.Any(b => b.level == c.A.level && <other criteria>)
select new { c.Id, c.Level }
如果 where ...
还包含 A
的筛选条件,您可以将 && c.A == ...
之类的谓词添加到 where
。
请注意,我假设导航 属性 c.A
存在,否则将被创建,因为 C
具有 AId
.