我在.net core 3(预览版5)剃刀页面应用程序中创建了Lambda LEFT联接,但是由于某种原因,我无法使其正常工作。
我遇到以下问题:
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
我一般来说对Lambda还是陌生的,所以也许这很明显。我正在使用EF Core,并使用EF Core电动工具生成了EF Core模型(对表进行反向工程)。
答案 0 :(得分:2)
Gert Arnold为类似的问题写了一个很好的答案,解释了Linq联接的工作方式: Linq to Entities join vs groupjoin
在Linq查询上使用.SelectMany()
似乎使您失去了扁平化部分。
在第2部分上方的链接答案中对此进行了描述。