繁体   English   中英

EF 核心 2.1 选择/区分

[英]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 查询

这对我有用:

  1. 结果查询中删除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();

非常感谢您的评论,这对我很有帮助。

我总是喜欢直接从返回数据的表(好吧,DbSet)中查询您想要的数据。 该过程看起来有点像以下步骤:

  1. 我想要C.IdC.Level
  2. 那是context.Cs
  3. 我想要哪个C
  4. 具有父的那些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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM