【问题标题】:Lambda / Linq Left joining table(s) does not return expected resultLambda / Linq 左连接表不返回预期结果
【发布时间】:2019-06-20 10:32:03
【问题描述】:

我在我的 .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 中,这会产生 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.'. 

接下来,我尝试在我的 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 模型(对表进行逆向工程)。

【问题讨论】:

  • 你为什么要左连接,然后将验证添加到不为空。那么你可以简单地使用内部连接,还是我错过了什么?
  • 好点。原始查询与我需要执行 LEFT JOIN 的地方不同,但现在情况不再如此。
  • @TomasChabada 使用常规 (INNER) JOIN 它可以工作。预期结果是正确的,WHERE 子句有效。仍然想知道为什么它不能与GroupJoin 一起使用..
  • 不确定,但是当我想在代码中实现left join 时,我使用DefaultIfEmpty 方法,它被转换为常规左连接

标签: c# entity-framework linq lambda


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-01
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-15
    • 2021-07-15
    相关资源
    最近更新 更多