【发布时间】: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