Исключение LINQ To SQL: локальная последовательность не может использоваться в реализации операторов запросов LINQ to SQL, кроме оператора Contains. - PullRequest
23 голосов
/ 11 ноября 2009

Рассмотрим этот запрос LINQ To SQL. Намерение состоит в том, чтобы взять строку [] поисковых терминов и применить эти термины к группе различных полей в таблице SQL:

string[] searchTerms = new string[] {"hello","world","foo"};
List<Cust> = db.Custs.Where(c => 
   searchTerms.Any(st => st.Equals(c.Email))
|| searchTerms.Any(st => st.Equals(c.FirstName))
|| searchTerms.Any(st => st.Equals(c.LastName))
|| searchTerms.Any(st => st.Equals(c.City))
|| searchTerms.Any(st => st.Equals(c.Postal))
|| searchTerms.Any(st => st.Equals(c.Phone))
|| searchTerms.Any(st => c.AddressLine1.Contains(st))
)
.ToList();

Возникло исключение:

Локальная последовательность не может использоваться в реализации операторов запросов LINQ to SQL, кроме оператора Contains ()

Вопрос: Почему возникает это исключение и как можно переписать запрос, чтобы избежать этого исключения?

Ответы [ 4 ]

33 голосов
/ 11 ноября 2009

Замените использование Any на Contains в вашем запросе. например:

searchTerms.Contains(c.Email)

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

Часть AddressLine1 не будет работать таким образом - вам придётся выполнить цикл-генерацию сравнений самостоятельно с помощью

c.addressLine1.Contains(...)

Что-то вроде PredicateBuilder может быть полезным для этого.

11 голосов
/ 25 марта 2010

Просто мысль (напрямую не связанная с вопросом, но может помочь другим зрителям):

Я получал то же сообщение об ошибке, что и вы, хотя я правильно использовал метод Contains (), и мне потребовалось довольно много времени, чтобы понять, что корень моей проблемы - возвращать IEnumerable к чему-то, что нужно далее отфильтровать результаты запроса L2S. Как только я изменил тип возвращаемого значения функции на IQueryable, проблема исчезла. Это имеет смысл, видя, что IEnumerable не может быть далее отфильтрован, но IQueryable может.

0 голосов
/ 07 ноября 2017

По сути, ошибка говорит о том, что вы делаете соединение между двумя коллекциями, одна из которых является таблицей базы данных, а другая - массивом. LINQ не предназначен для этого - либо оба должны быть в базе данных, либо оба в памяти (за исключением особого случая при использовании Contains)

0 голосов
/ 20 февраля 2015

Я получаю ту же ошибку, но ни одно из вышеперечисленных решений не помогло мне.

Для меня сработало приведение db.Custs в список сначала , например:

List<Cust> =db.Custs.ToList<Cust>.Where(...

Понятия не имею, почему это сработало, но это сработало.

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