我在我的.net核心3(预览5)剃须刀页面应用程序中创建了Lambda,但由于某些原因,我无法使它正常工作。
我有以下问题:
T-SQL和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总的来说,我对兰博达非常陌生,所以这可能是显而易见的。我正在使用EF核心,并生成EF核心模型使用EF核心动力工具(反向工程表)。
发布于 2019-06-20 12:20:42
Gert Arnold为类似的问题写了一个很好的答案,解释了Linq是如何加入工作的:Linq to Entities join vs groupjoin
通过在Linq查询上使用.SelectMany(),您似乎缺少了扁平化部分。这一点将在第2部分的链接答案中描述。
https://stackoverflow.com/questions/56684080
复制相似问题