C# Lambda/Linq左联接表未返回预期结果

C# Lambda/Linq左联接表未返回预期结果,c#,entity-framework,linq,lambda,C#,Entity Framework,Linq,Lambda,我在我的.NETCore3(preview 5)razor页面应用程序中创建了一个Lambda左连接,但由于某些原因,我无法使它正常工作 我有以下问题: 来自T-SQL和Lambda的结果是不同的 我的其中Lambda中的零件生成错误 我想在我的应用程序中使用lambda重新创建以下查询: SELECT ai.crArtNrLeverancier, pli.crartnr FROM [tblArtikelImport] ai LEFT JOIN tblPLInkoop pli

我在我的.NETCore3(preview 5)razor页面应用程序中创建了一个Lambda左连接,但由于某些原因,我无法使它正常工作

我有以下问题:

  • 来自
    T-SQL
    和Lambda的结果是不同的
  • 我的
    其中
    Lambda中的零件生成错误
我想在我的应用程序中使用lambda重新创建以下查询:

SELECT 
   ai.crArtNrLeverancier,
   pli.crartnr
FROM [tblArtikelImport] ai
LEFT JOIN tblPLInkoop pli on pli.crArtNr = ai.crArtNrLeverancier
WHERE pli.crartnr is not null 
T-SQL
中,这将导致22241条记录

我的Lambda查询以获得相同的结果集:

var data = await _context.TblArtikelImport.GroupJoin(_context.TblPlinkoop,
    ai => ai.CrArtNrLeverancier,
    pli => pli.CrArtNr,
    (ai, pli) => new { ArtikelImport = ai, PLInkoop = pli })
    .Where(c => c.PLInkoop.Any(cc => cc.CrArtNr != null)).ToListAsync();
使用
pli-anonymous
类型,我无法直接选择字段,这就是为什么我尝试使用
PLInkoop.Any

其中
部分返回以下错误:

InvalidOperationException: Error generated for warning 'Microsoft.EntityFrameworkCore.Query.QueryClientEvaluationWarning: The LINQ expression 'where ([cc].CrArtNr != null)' could not be translated and will be evaluated locally.'. 
接下来,我尝试完全删除Lambda语句中的
Where
部分,结果如下:

var data2 = await _context.TblArtikelImport.GroupJoin(_context.TblPlinkoop,
    ai => ai.CrArtNrLeverancier,
    pli => pli.CrArtNr,
    (ai, pli) => new { ArtikelImport = ai, PLInkoop = pli })
    .ToListAsync();
上面的Lambda语句返回32962条记录,而下面的
T-SQL
语句(应该相同)返回51809条记录:

SELECT 
       ai.crArtNrLeverancier,
       pli.crartnr
FROM [tblArtikelImport] ai
LEFT JOIN tblPLInkoop pli on pli.crArtNr = ai.crArtNrLeverancier
一般来说,我对Lambda还很陌生,所以这可能是显而易见的。我正在使用EF Core,并使用EF Core电动工具生成EF Core模型(对表格进行反向工程)

为一个类似的问题写了一个极好的答案,解释了Linq连接是如何工作的:

在Linq查询中使用
.SelectMany()
似乎缺少展开部分。 这在第2部分上面的链接答案中进行了描述。

为一个类似的问题编写了一个极好的答案,解释了Linq连接是如何工作的:

在Linq查询中使用
.SelectMany()
似乎缺少展开部分。
第2部分上面的链接答案中描述了这一点。

为什么要加入,然后将验证添加到NOTNULL。然后你可以简单地使用内部连接,或者我遗漏了什么?很好。在我需要进行左连接的地方,原始查询是不同的,但现在不再是这种情况了。@TomasChabada和常规(内部)连接一起工作。。预期结果是正确的,
WHERE
子句有效。仍然想知道为什么它不能与
GroupJoin
一起工作..虽然不确定,但是当我想在代码中实现
left join
时,我使用
DefaultIfEmpty
方法,并将其转换为常规left join,然后将验证添加到notnull。然后你可以简单地使用内部连接,或者我遗漏了什么?很好。在我需要进行左连接的地方,原始查询是不同的,但现在不再是这种情况了。@TomasChabada和常规(内部)连接一起工作。。预期结果是正确的,
WHERE
子句有效。仍然想知道为什么它不能与
GroupJoin
一起工作..不确定,但是当我想在代码中实现
left join
时,我使用
DefaultIfEmpty
方法,并将其转换为常规left join