Linq внешнее объединение с использованием неравенства? - PullRequest
4 голосов
/ 19 июня 2011

В SQL я бы сказал:

select a.*
from TableA a 
left join TableB b on a.Type = b.Type and a.SomeDate < b.AnotherDate
where b.ID is null

При этом будут выбраны все записи в Таблице A, в которых нет записей в Таблице B с той же Type и более поздней датой.

В LinqКак вы это делаете?

from a in TableA
join b in TableB on a.Type equals b.Type into j // what about the comparator?
from x in j.DefaultIfEmpty()
where x == null
select a;

Спасибо!

РЕДАКТИРОВАТЬ:

Было предложено несколько хороших ответов, каждый из которых адресконкретная потребность выражена в этом вопросе, но все они в основном обходные пути.Все они так или иначе переводят во вложенные «существующие» запросы, тогда как SQL в вопросе - это один аккуратный запрос без вложенности.Случай, приведенный здесь, является лишь примером общего принципа;то, что я действительно хотел бы видеть, это выражение Linq, которое будет переводить (примерно) синтаксис вышеуказанного SQL-запроса.

Ответы [ 3 ]

3 голосов
/ 19 июня 2011

Как-то так должно помочь:

var results = 
    (from itemA in TableA
    from itemB in TableB
    where itemA.Type != itemB.Type && itemA.Date < itemB.Date
    select itemA).Distinct();
2 голосов
/ 20 июня 2011
from a in tableA
let rights =
  from b in tableB
  where a.Type == b.Type && a.Date < b.Date
  select b
where !rights.Any()
select a;

Это переведено на:

SELECT [t0].[Type] AS [Type], [t0].[SomeDate] AS [SomeDate]
FROM [TableA] AS [t0]
WHERE NOT (EXISTS(
    SELECT NULL AS [EMPTY]
    FROM [TableB] AS [t1]
    WHERE ([t0].[Type] = [t1].[Type]) AND ([t0].[SomeDate] < [t1].[AnotherDate])))
1 голос
/ 19 июня 2011
var results = TableA.Where(a => 
                 !TableB.Any(b => a.Type == b.Type && a.Date < b.Date))

Если вы хотите, чтобы запрос linq был точно таким же, как ваш SQL, вы можете написать:

var result = from a in TableA
             from b in TableB.Where(b => a.Type = b.Type && a.SomeDate < b.AnotherDate).DefaultIfEmpty()
             where b == null
             select a;

Но я бы сказал, что первое решение лучше, поскольку where b == null приведет к операции фильтра в плане запросов.

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