Entity Framework Core для SQL Server IN - PullRequest
7 голосов
/ 15 марта 2019

Мы преобразовываем из LINQ в SQL в Entity Framework Core 2.2 и обнаруживаем, что перевод операций Contains не становится выражениями IN в SQL Server.Происходит то, что EFCore извлекает все данные, используя другие условия, а затем фильтрует их локально.Это не приемлемо.Мы можем использовать EF.Functions.Contains, но для этого необходимо, чтобы мы включили полнотекстовый поиск в SQL Server, что является чрезмерным уничтожением.

Любая идея, как получить оператор, подобный следующему, для перевода в предложение IN в SQLСервер?

var myValues = new [] { 1, 2, 3, 4, 5 };
var qry = _context.Table.Where(t => myValues.Contains(t.TableProperty));

Ладно, может быть, я упростил код, чтобы он был проще для вопроса.Фактический код выглядит следующим образом:

    voterQuery = voterQuery.Where(v => voterFilter.VoterStatus.Select(p => p.Value).Contains(v.VotStatus.ToString()));

В нашем коде происходит то, что мы создаем IQueriable из пользовательских выборок на экране фильтрации.voterFilters содержит коллекцию этих критериев выбора.VoterStatus - это один из критериев выбора, который представляет собой список, который принадлежит элементу управления Winforms CheckedListItems.Выбор p.Value возвращает список строк.Я попытался спроецировать список строк в массив с теми же результатами, что и предложение IN, которое не было создано, или запросом к серверу.Возможно, EFCore не позволяет использовать строки для значений предложения IN.Любое понимание будет оценено.

1 Ответ

5 голосов
/ 18 марта 2019

В настоящее время (начиная с v2.2.3) EF Core требует, чтобы выражение, используемое для Contains, представляло собой простую переменную IEnumerable<T> (без операторов LINQ), где T - тип примитива.

Это означает, что вам нужно переместить voterFilter.VoterStatus.Select(p => p.Value) в переменную вне дерева выражений запроса и использовать эту переменную внутри:

var voterStatusFilter = voterFilter.VoterStatus.Select(p => p.Value);
voterQuery = voterQuery.Where(v => voteStatusFilter.Contains(v.VotStatus.ToString()));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...