Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用不等式的Linq外连接?_C#_Linq_Linq To Sql - Fatal编程技术网

C# 使用不等式的Linq外连接?

C# 使用不等式的Linq外连接?,c#,linq,linq-to-sql,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 谢谢 编辑: 已经提出了一些很好的答案,所有这些答案都解决了这个问题中表达的特定需求,但它们基本上都是权宜之计。它们都以某种方式转换为嵌套的“exists”查询,而问题中的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
谢谢

编辑:


已经提出了一些很好的答案,所有这些答案都解决了这个问题中表达的特定需求,但它们基本上都是权宜之计。它们都以某种方式转换为嵌套的“exists”查询,而问题中的SQL是一个没有任何嵌套的整洁查询。这里给出的例子只是一个一般原则的例子;我真正希望看到的是一个Linq表达式,它将(大致)转换为上述SQL查询的语法。

类似的内容应该会有所帮助:

var results = 
    (from itemA in TableA
    from itemB in TableB
    where itemA.Type != itemB.Type && itemA.Date < itemB.Date
    select itemA).Distinct();
var结果=
(摘自表A第A项)
来自表B中的项目B
其中itemA.Type!=itemB.Type&&itemA.Date
var results=TableA.Where(a=>
!TableB.Any(b=>a.Type==b.Type&&a.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;
var result=来自表a中的a
从表b中的b开始,其中(b=>a.Type=b.Type&&a.SomeDate
但是我要说的是,第一种解决方案更好,因为
其中b==null
将导致queryplan中的筛选操作。

来自表a中的a
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;
让权利= 来自表b中的b 其中a.Type==b.Type&&a.Date
它被翻译成:

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])))
选择[t0].[Type]作为[Type],选择[t0].[SomeDate]作为[SomeDate]
从[表A]改为[t0]
不存在的地方(
选择NULL作为[空]
从[表B]到[t1]
其中([t0].[Type]=[t1].[Type])和([t0].[SomeDate]<[t1].[AnotherDate]))

这不是不等式,而是一个比较(小于)。对于指定的查询,“存在查询”实际上是解决方案和更好的实现。请尝试在下面查看“我的查询”的执行计划。“左连接”或“嵌套查询”是实现细节和语法差异。@Magnus/@_FRED_u2;-有趣的是-当您执行这样的外部连接时,内部总是发生这种情况吗?投票反对的人-“如果您解释了原因,那就太好了…?感谢您的所有解释-您在帖子中击败了@_FRED_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])))