Я создал Lambda LEFT-соединение в своем приложении-странице бритвы .net core 3 (preview 5), но по какой-то причине я не могу заставить его работать должным образом.
У меня есть следующие проблемы:
- Результаты от
T-SQL
и лямбда разные
- Моя
Where
часть в лямбде выдает ошибку
У меня есть следующий запрос, который я хочу воссоздать в своем приложении с помощью лямбды:
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 записям.
Мой лямбда-запрос для получения того же набора результатов:
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 (для обратного проектирования таблиц)