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