Линк к сущности: используйте словарь в запросе - PullRequest
6 голосов
/ 03 октября 2011

У меня есть:

Dictionary<int, List<int>> dict = new ...
var a = SomeEntity.Where(f => dict[f.key].Contains(f.someValue)) 

это приводит к ошибке

 LINQ to Entities does not recognize the method 'System.Collections.Generic.List`1[System.Int32] get_Item(Int32)' method

, в то время как со списками это работает:

List<int> l = new ...
var a = SomeEntity.Where(f => l.Contains(f.someValue))

Таково ли это ограничение linq для EFили я что-то упустил?

1 Ответ

11 голосов
/ 03 октября 2011

Это характер Entity Framework - когда вы помещаете выражения в свой запрос, он делает все возможное, чтобы перевести их в SQL, чтобы эту работу можно было выполнить на сервере.

В вашем первом примере он пытается перевести запрос и запрос поиска в словаре в SQL и не может этого сделать, поскольку не знает, как это сделать.

Во втором примере вы просто передаете список в запрос. Он знает, как перевести это на SQL.

Есть несколько подобных ошибок, поэтому вам нужно просто помнить об этом, прежде чем определять свой запрос EF.

EDIT

Только что заметил, что ваш первый запрос использует результаты запроса при чтении из словаря. Таким образом, поскольку вы фактически не можете передать свой словарь в запрос SQL, вам, вероятно, потребуется сначала извлечь все записи из БД, а затем использовать LINQ-to-objects для выполнения вашей проверки, например:

Dictionary<int, List<int>> dict = new ...
var a = SomeEntity
    .ToArray()
    .Where(f => dict[f.key].Contains(f.someValue));

Метод ToArray() вытягивает весь набор результатов в память (есть другие способы сделать это, но я обычно так делаю), и следующее предложение Where выполняется в LINQ-to-objects вместо LINQ-to-Entities, то есть код вашего словаря будет работать нормально.

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