Лямбда / Линк Левые таблицы присоединения не дают ожидаемого результата - PullRequest
0 голосов
/ 20 июня 2019

Я создал 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 (для обратного проектирования таблиц)

1 Ответ

2 голосов
/ 20 июня 2019

Герт Арнольд написал отличный ответ на аналогичную проблему, объясняющую, как работает объединение Linq: Объединение Linq to Entities против groupjoin

Похоже, выотсутствует уплощающая часть с помощью .SelectMany() в запросе Linq.Это описано в связанном ответе чуть выше части 2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...