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 查询

这对我有用:

  1. result 查询中删除 Distinct(),避免添加 t.AId 到我的选择。
  2. 从我的选择字段之一中删除辅助方法,执行将 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 数据中查询您想要的数据。该过程看起来有点像这些步骤:

  1. 我想要 C.IdC.Level
  2. 那是 context.Cs
  3. 我想要哪个 C
  4. 具有父级 A 的那些,其中至少有一个 BA 具有相同的 '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.