Цепочка, где пункты не возвращают результаты - PullRequest
1 голос
/ 12 июля 2011

У меня есть метод поиска, который принимает список идентификаторов, и я хочу ограничить запрос на основе идентификаторов.

Параметр: IEnumerable filterType

foreach (int id in filterType)
{
    query = query.Where(q => q.Item1 == id);
}

Если я попытаюсь:

foreach (int id in filterType)
{
    query = query.Where(q => q.Item1 != id);
} 

Вроде работает.

Кто-нибудь знает почему?

Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 12 июля 2011

Множество where предложений эффективно объединяются "И-ed" - поэтому, если в вашем списке filterType есть 5 и 10, вы бы сказали, что Item1 должно быть и 5 , и * 1005.* 10, чего не может быть одновременно.

Я подозреваю, что вы действительно хотите:

query = query.Where(q => filterType.Contains(q.Item1));

Другими словами, где Item1 соответствует один из значения в filterType.(Вы также можете рассмотреть случай, когда filterType пусто. Должно ли это совпадать со всем или ничего?)

2 голосов
/ 12 июля 2011

Делая query = query.Where(q => q.Item1 == id);, вы фактически создаете запрос, подобный следующему:

query.Where(q => q.Item1 == id1)
     .Where(q => q.Item1 == id2)
     .Where(q => q.Item1 == id3)
     .Where(q => q.Item1 == id4);

Что, очевидно, не даст результатов: элемент не может иметь два разных идентификатора.

Вы, вероятно, хотите:

query.Where(q = filterType.Contains(q.Item1));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...