[英]EF core 2.1 select/distinct
我正在使用 sql profiler 查看 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 查询
这对我有用:
这是我更正后的查询:
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();
非常感谢您的评论,这对我很有帮助。
我总是喜欢直接从返回数据的表(好吧,DbSet)中查询您想要的数据。 该过程看起来有点像以下步骤:
C.Id
和C.Level
context.Cs
。C
?A
,其中至少一个B
具有相同的“等级”如A
并且满足几个其他标准(在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
过滤条件,您可以将诸如&& cA == ...
类的谓词添加到where
。
请注意,我假设导航属性cA
存在,否则将创建,因为C
具有AId
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.