Linq Take игнорируется в операторе SQL, если включено групповое соединение - PullRequest
0 голосов
/ 17 апреля 2020

По сути, сгенерированный SQL из Linq, похоже, игнорирует команду «Взять», когда мы включаем групповое объединение следующей таблицы счетов-фактур.

                        var queryCommand = from m in _context.CustomerInfo
                                       join sq in customerAnalysisGroupQuery on m.CustomerInfoId equals sq.customerAnalysisGroupQueryCustomerInfoId
                                       join igq in _context.Invoices on m.CustomerInfoId equals igq .invoicesGroupQueryCustomerInfoId into igq2
                                       from igq in igq2.DefaultIfEmpty()

                                       select new TableModelForServerPagination()
                                       {
                                           reportInfo = sq,
                                           customerInfo = m,
                                           invoicesInfo = igq 
                                       };


                                       var queryList = queryCommand.Take(50).ToList();

Таблица счетов-фактур может содержать несколько счетов-фактур для каждый покупатель Запрос на анализ генерирует один анализ для каждого клиента.

Сгенерированный код SQL приводит к одному очень длинному запросу sql, который некорректно завершается командой Order by m.CustomerInfoId

Если мы опускаем В таблице счетов-фактур сгенерированный код приводит к одному очень длинному запросу sql, который корректно заканчивается LIMIT 50

. Прием неправильно сгенерированного запроса SQL и добавление к нему «LIMIT 50» дает те же результаты, что и правильно сгенерированный SQL запрос.

Мы используем MariaDB и entity. net core 3.1. Может ли кто-нибудь понять, что здесь произошло?

1 Ответ

0 голосов
/ 17 апреля 2020

Оказывается, мы использовали IEnumerable для хранения invoicesInfo. После удаления он генерирует запрос правильно с лимитом 50.

...