c# - Lambda / Linq 左连接表不返回预期结果
问题描述
我在我的 .net core 3(预览版 5)剃须刀页面应用程序中创建了 Lambda LEFT 连接,但由于某种原因,我无法使其正常工作。
我有以下问题:
- 和 Lambda 的结果
T-SQL
不同 - 我
Where
在 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
该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 模型(对表进行逆向工程)。
解决方案
Gert Arnold为解释 Linq 连接如何工作的类似问题写了一个很好的答案: Linq to Entities join vs groupjoin
似乎您.SelectMany()
在 Linq 查询上使用时缺少展平部分。这在第 2 部分上方的链接答案中进行了描述。
推荐阅读
- java - 两个Fragment之间的接口通信
- nlp - 用于 CRF 分类器的 StanfordNLP 训练迭代
- r - 如何使用 quantmode 向多个烛台图表添加简单的移动平均线
- asp.net - Visual Studio 2017 不会编译我的 ASP.NET Web 项目,对肯定被引用的库说“无法加载文件或程序集”
- javascript - 空复选框上的 Javascript“空”验证消息
- r - 使用 if else 条件将模型拟合到分组数据
- angular - 具有多个插入的 rxjs 运算符
- android - 使用适用于 Android 的柯南配置文件构建 Poco C++ 库
- io - 如何在不分配字符串的情况下将 Rust 整数类型转换为其字符串表示形式?
- django - Django获取集合中对象多对多字段的计数