2010-03-24 2 views
3

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

У меня есть таблица пользователей с полем 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.

+0

Что ошибка вы получаете? – Rik

+0

Кроме того, скомпилированный LinQ может быть менее полезным, чем вы думаете, см .: http://www.codinghorror.com/blog/2010/03/compiled-or-bust.html – Rik

ответ

0

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

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

+0

, если я изменю тип данных на строку, будет ли это работать в подчиненном linq? я просто не вижу причины, почему это должно иметь значение. – RuSh

8

У меня такая же проблема. На данный момент я справился только с одним обходным решением этой проблемы. Вместо того чтобы использовать

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

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

u.LookingFor.ToString().IndexOf(lookingFor) >= 0 
+1

Я использую это решение, однако в большинстве случаев вы, вероятно, хотите> = 0, а не> 0, если оно находится в начале строки. – kad81

Смежные вопросы