EF core 2.1 выбрать / отличить - PullRequest
0 голосов
/ 06 января 2019

Я использую sql profiler, чтобы увидеть sql, сгенерированный Ef core2.1, это мой запрос 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 / Different с результатом IQueryable, но сгенерированный sql такой же. что я пропустил в своем запросе linq или что я должен добавить, чтобы получить этот sql запрос

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Я всегда фанат запросов данных, которые вы хотите прямо из таблицы (ну, DbSet), которая возвращает данные. Процесс выглядит примерно так:

  1. хочу C.Id и C.Level
  2. Это context.Cs.
  3. Какие C s я хочу?
  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, вы можете добавить предикаты, например && c.A == ..., к where.

Обратите внимание, что я предполагаю, что свойство навигации c.A присутствует, иначе будет создано, потому что C имеет AId.

0 голосов
/ 06 января 2019

Вот что у меня сработало:

  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();

Большое спасибо за ваши комментарии, это действительно помогло мне.

...