首页 > 解决方案 > Lambda / Linq 左连接表不返回预期结果

问题描述

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

我有以下问题:

我有以下查询,我想使用 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

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.'. 

接下来,我尝试Where在我的 Lambda 语句中完全删除该部分,结果如下:

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

标签: c#entity-frameworklinqlambda

解决方案


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

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


推荐阅读