Скомпилированный Linq & String.Contains - PullRequest
3 голосов
/ 24 марта 2010

Я использую Linq-to-SQL и использую скомпилированный Linq для повышения производительности.

У меня есть таблица пользователей с полем INT под названием «LookingFor», которое может принимать следующие значения: 1,2,3,12,123,13,23.

Я написал запрос для возврата пользователей на основе столбца «LookingFor» и хочу вернуть всех пользователей, которые содержат значение «LookingFor» (не только те, которые равны ему).

Например, если user.LookingFor = 12, а параметром запроса является 1, и этот пользователь должен быть выбран.

private static Func<NeDataContext, int, IQueryable<int>>
      MainSearchQuery = CompiledQuery.Compile((NeDataContext db, int lookingFor) =>
         (from u in db.Users
          where (lookingFor == -1 ? true : u.LookingFor.ToString().Contains(lookingFor)                         
    select u.username);

Это работает на несоответствующем linq, но выдает ошибку при использовании скомпилированного. Как мне это исправить с помощью скомпилированного Linq?

Я получаю эту ошибку:

Для метода String.Contains поддерживаются только аргументы, которые можно оценить на клиенте.

Ответы [ 2 ]

8 голосов
/ 27 сентября 2011

Я столкнулся с той же проблемой. Мне удалось пока только один обходной путь для этой проблемы. Вместо использования

u.LookingFor.ToString().Contains(lookingFor)

Я использовал

u.LookingFor.ToString().IndexOf(lookingFor) >= 0
0 голосов
/ 24 марта 2010

Вы выполняете операции с аргументом LookingFor, который не может быть переведен в SQL. Я на самом деле удивлен, что это работает, когда не компилирует запрос.

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

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