2012-09-07 3 views
2

Я использую представление, возвращающее Домены в соответствии с идентификатором. Столбец Домены может быть «География» или может быть заполненными доменами «География, история». (В любом случае, данные, возвращаемые является VARCHAR)LINQ to SQL где строка проверки строки содержит элемент списка

В моей C# код, у меня есть список, содержащий основные домены:

private static List<string> _mainDomains = new List<string>() 
{ 
    "Geography", 
    "Mathematics", 
    "English" 
}; 

Я хочу, чтобы фильтровать мой LINQ запрос, чтобы вернуть только данные, относящиеся к к одному или нескольким основным домен:

expression = i => _mainDomains.Any(s => i.Domains.Contains(s)); 
var results = (from v_lq in context.my_view 
       select v_lq).Where(expression) 

проблема в том, что я не могу использовать Any ключевое слово, ни Exists ключевого слова, так как они не доступны в SQL. Я видел много решений, используя ключевое слово Contains, но это не соответствует моей проблеме.

Что мне делать?

+0

Выполнение запроса с использованием ключевого слова 'Any' генерирует эту ошибку: Локальная последовательность не может использоваться в реализациях LINQ to SQL операторов запросов кроме оператора Содержит. –

ответ

0

Я понял. Поскольку я не могу использовать Any ключевое слово, я использовал эту функцию:

public static bool ContainsAny(this string databaseString, List<string> stringList) 
    { 
     if (databaseString == null) 
     { 
      return false; 
     } 
     foreach (string s in stringList) 
     { 
      if (databaseString.Contains(s)) 
      { 
       return true; 
      } 
     } 
     return false; 
    } 

Итак, я могу использовать это выражение в моей Where статье:

expression = i => i.Domains.ContainsAny(_mainDomains); 

Update: Согласно ЕГР, запрос вернет все значения и выполнит команду сервера where where. Лучшим решением было бы использовать другой подход (и не использовать значения с заполненными/запятыми)

+0

Это не переводит на SQL. Это не работает. – usr

+0

Это работает, я отвечаю на свой вопрос? –

+1

Хорошо, он работает, но это не то, что вы хотите. Это делает фильтрацию на клиенте. Это проблема производительности, которая становится все больше, чем больше растет набор данных. – usr

3

Вы можете использовать содержит:

where i.Domains.Any(s => _mainDomains.Contains<string>(s.xxx)) 

Обратите внимание, что общие аргументы требуются (даже если Resharper может сказать вам, что они не являются). Они должны выбрать Enumerable.Contains, а не List.Contains. Последний не является переводимым (что я считаю ошибкой в ​​дизайне продукта L2S).

(Возможно, я не получил запрос точно для вашей модели данных. Пожалуйста, просто приспособите его к вашим потребностям).

+0

Я знаю, как использовать «Содержит», но это не соответствует моей потребности ... –

+0

Он подходит вам, если вы попробуете. Я только что редактировал свой пост, чтобы сделать код немного легче адаптироваться. Я полностью не понял вашу модель, поэтому вам нужно полностью ее выполнять. Я знаю по опыту, что Содержит то, что вам нужно. Вам нужно вызвать contains в локальной коллекции. – usr

+2

использовать 'Содержит' с другого направления * не s.Contains, но _mainDomains.Contains (s) * – S3ddi9

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