Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.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# 当right为null时的Left join_C#_Linq - Fatal编程技术网

C# 当right为null时的Left join

C# 当right为null时的Left join,c#,linq,C#,Linq,我试图在c中左键联接,以便只从Foo中查找不在Bar中的值。 在SQL中,我通常会这样做: SELECT * FROM FOO f LEFT JOIN BAR b ON f.ID = b.ID WHERE b.ID IS NULL 对于linq,我通常会这样做: var matches = Foos.Join( Bars, foo => foo.ID, bar => bar.ID, (foo, bar) => foo ).Select(x =&

我试图在c中左键联接,以便只从Foo中查找不在Bar中的值。 在SQL中,我通常会这样做:

SELECT * FROM FOO f
LEFT JOIN BAR b ON f.ID = b.ID
WHERE b.ID IS NULL
对于linq,我通常会这样做:

var matches = Foos.Join(
    Bars,
    foo => foo.ID,
    bar => bar.ID,
    (foo, bar) => foo
).Select(x => x.ID);
然后:

var noMatch = Foos.Where(x => !matches.Contains(x.ID));

现在问一个问题:在.Join函数中有没有实现这一点的方法?

您可以执行左连接,如下所示:

var query= from f in Foos
           join b in Bars on f.Id equals b.Id into gb
           from sb in gb.DefaulfIfEmpty()
           where sb.ID==null
           select {f, sb};

像这样的工作:

Foos.
.GroupJoin(
    Bars,
    f => f.Id,
    b => b.Id,
    (f, lj) => new { f, lj })
    .SelectMany(t => t.lj.DefaultIfEmpty(),
            (t, b) => new { 
                foo = t.f,
                bar = b
                })
    .Where(a => a.bar.Any() == false)
    .ToList()   

查询语法版本已经回答,但我个人更喜欢方法语法:

var result = Foos
  .GroupJoin(
    Bars,
    f => f.ID,
    b => b.ID,
    (fos, bas) => new { Foo = fos, Bar = bas })
  .SelectMany(
    sum => sum.Bar.DefaultIfEmpty(),
    (sum, flatBar) => new 
    {
      Foo = sum.Foo,
      Bar = flatBar
    })
  .Where(anon => !anon.Bar.Any());

我认为你的linq join是错误的;它必须是GroupJoin。查看哪些处理连接。然后,您可以选择适当的空值。对于左连接,linq等价物是GroupJoin。不确定,但这似乎适用于context.Foos.Wherefoo=>!foo.bar.Any.ToList。我不确定EF是否在客户端评估任何部件。这就是为什么我不把它作为一个答案什么是lambda等价物?使用上面引用的GroupJoin,但IMHO查询语法更好地描述了您试图实现的目标,它接近sql syntaxI绝对同意;lambda语法非常复杂。在某些情况下,我更喜欢使用更好的方法语法,因为在最后,查询语法只是一种语法糖,查询被转换为方法语法,但这取决于上下文;我认为这缺少了b.ID为NULL的地方condition@AlanCheungt.lj.DefaultIfEmpty是否对此进行了解释?Sorta,它将一个空列表放置到位,否则列表lj将为空,但不会从结果中删除它们。它最终在下面的匿名对象中创建了一个bar=empty LIST抱歉,我没有正确阅读您的第一个问题。是的,条件缺失的地方。