Linq外联使用不等式?

时间:2011-06-19 16:29:59

标签: c# linq linq-to-sql

在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

这将选择TableA中的所有记录,其中TableB中不存在相同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 个答案:

答案 0 :(得分:3)

这样的事情应该有所帮助:

var results = 
    (from itemA in TableA
    from itemB in TableB
    where itemA.Type != itemB.Type && itemA.Date < itemB.Date
    select itemA).Distinct();

答案 1 :(得分:2)

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])))

答案 2 :(得分:1)

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会导致查询计划中的过滤操作。