Lambda / Linq左连接表未返回预期结果

时间:2019-06-20 10:32:03

标签: c# entity-framework linq lambda

我在.net core 3(预览版5)剃刀页面应用程序中创建了Lambda LEFT联接,但是由于某种原因,我无法使其正常工作。

我遇到以下问题:

  • T-SQL和Lambda的结果不同
  • 我在Lambda中的Where部分产生了错误

我有以下查询,我想使用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中将产生2​​2241条记录。

我的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

WHERE部分返回以下错误:

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模型(对表进行反向工程)。

1 个答案:

答案 0 :(得分:2)

Gert Arnold为类似的问题写了一个很好的答案,解释了Linq联接的工作方式: Linq to Entities join vs groupjoin

在Linq查询上使用.SelectMany()似乎使您失去了扁平化部分。 在第2部分上方的链接答案中对此进行了描述。