C # Predicate Builder с функцией «НЕ В» - PullRequest
6 голосов
/ 23 августа 2011

Как с помощью PredicateBuilder получить функциональность, аналогичную запросу SQL IN или NOT IN?

Например, у меня есть список идентификаторов, и я хочу выбрать всех людей, идентификаторы которых совпадают или не совпадают с идентификаторами.

Люди соответствуют функциональности довольно просто (хотя может быть лучший способ сделать это)

var predicate = PredicateBuilder.False<Person>()
foreach (int i in personIDs)
{
  int temp = i;
  predicate = predicate.Or(e=>e.PersonID == temp);
}
return persons.Where(predicate);

Так как мне получить противоположное? Я хочу, чтобы все лица, чьи идентификаторы отсутствуют в списке идентификаторов персон.

Ответы [ 4 ]

3 голосов
/ 23 июля 2012

Используете ли вы Entity Framework?

Затем вы можете построить запрос без PredicateBuilder:

var personIds = new List<int>() { 8,9,10 };
var query = persons.Where(it => !personIds.Contains(it.PersonId));

Из этого оператора LINQ создается запрос SQL NOT IN.

3 голосов
/ 23 августа 2011

Спросите Де Морган :

НЕ (P ИЛИ Q) = (НЕ P) И (НЕ Q)

Чтобы ваш код генерировал эквивалент условия NOT IN, перепишите его как

var predicate = PredicateBuilder.True<Person>()

и

predicate = predicate.And(e=>e.PersonID != temp);
0 голосов
/ 23 августа 2011

Не глядя на API ....

var predicate = PredicateBuilder.True<Person>()
foreach (int i in personIDs)
{
    int temp = i;
    predicate = predicate.And(e=>e.PersonID != temp);
}
return persons.Where(predicate);
0 голосов
/ 23 августа 2011

Это то, что вы хотите?

var predicate = PredicateBuilder.True<Person>()
foreach (int i in personIDs)
{
    int temp = i;
    predicate = predicate.And(e => e.PersonID != temp);
}
return persons.Where(predicate);
...