LINQ to Entites: как я могу реализовать этот сложный t-sql в LINQ (множественные объединения, DISTINCT, NOT EXISTS)? - PullRequest
1 голос
/ 28 января 2010

У меня сложный запрос, который я пытаюсь воспроизвести в LINQ to Entities, но я еще не там - возможно ли это?

Запрос t-sql выглядит следующим образом:

select distinct
 C.id,
 L.id
from
 dp
 join L on L.fk = DP.id
 join M on ( M.l_code = L.l_code and M.dp_code = DP.dp_code )
 join C on C.c_code = M.c_code
where not exists ( select id from map where map.cid = c.id and map.lid = l.id )

Таблицы выглядят так:

DP:
 id (pk)
 dp_code (varchar)

L:
 id (pk)
 fk (fk to DP.ID)
 l_code (varchar)

M:
 id (pk)
 l_code (varchar, matches value in L.l_code)
 dp_code (varchar, matches value in DP.dp_code)
 c_code (varchar, matches the value in C.c_code)

C:
id (pk)
c_code (varchar)

MAP:
id (pk)
cid (fk to C.id)
lid (fk to L.id)

Мой LINQ выглядит так:

  IQueryable foo = from dp in ctx.DP
             from l in dl.L
             join m in ctx.M on l.l_code equals m.m_code
            // Q1: how can I add:  AND m.dp_code = dp.dp_code
            join c in ctx.C on m.c_code = c.c_code
            // this works, but why can't I do it as an AND in the join?
            where m.dp_code == dp.dp_code
            select new 
            {
              cid = c.id,
              cid = c.id
            }.Distinct();

Итак, вопросы:

В1: Почему я не могу выполнить два условия в соединении? Ошибка пользователя или ограничения в LINQ?

Q2: Как я могу добавить NOT EXISTS к запросу? Я посмотрел на этот вопрос , но не вижу, как реализовать подзапрос NOT EXISTS.

1 Ответ

1 голос
/ 28 января 2010
  1. Можно, но обычно неправильно делать join вообще . Тем не менее, если необходимо, вы используете анонимные типы: on new { l: l.l_code, d: dp.code } equals new { l: m_code, d: m.dp_code }

  2. where !(from m in map where whatever select m).Any(). Но, как и в (1), лучше использовать ассоциации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...