как разделить или присоединиться к запросу linq на «или» (без использования Union)? - PullRequest
1 голос
/ 18 октября 2011

Предположим, вы ищете какой-либо объект с двумя логическими свойствами, A и B.

Что если у вас есть два запроса linq:

IQueryable<ObjectType> query = getIQueryableSomehow()
query.Where(x => x.A);

IQueryable<ObjectType> query2 = getIQueryableSomehow()
query2.Where(x => x.B);

Как я могу объединить эти запросы так, чтобычто они эквивалентны этому?:

IQueryable<ObjectType> query3 = getIQueryableSomehow()
query3.Where(x => x.A || x.B)

Я хотел бы использовать query3 = query.Union (query2), но, к сожалению, в моем объединении провайдера Linq не поддерживается.

Я разделендо случая для x => xA && xB путем цепочки предложения where.Вот что я имею в виду:

IQueryable<ObjectType> query = getIQueryableSomehow();
query = query.Where(x => x.A);
query = query.Where(x => x.B);

Есть ли какой-нибудь аналогичный обходной путь для случая или?

Спасибо,

Исаак

Ответы [ 2 ]

6 голосов
/ 18 октября 2011

с использованием Predicate Builder

IQueryable<ObjectType> query = getIQueryableSomehow();
var predicate = PredicateBuilder.False<ObjectType>();
predicate = predicate.Or(x => x.A);
predicate = predicate.Or(x => x.B);

var list = query.Where(predicate).ToList();
1 голос
/ 18 октября 2011

Если ваш поставщик LINQ не поддерживает оператор Union, вы всегда можете сначала материализовать результаты запроса с помощью ToArray (), а затем использовать поставщик LINQ-to-objects для выполнения объединения, которое он поддерживает, например так:

IQueryable<ObjectType> query = getIQueryableSomehow() 
query.Where(x => x.A); 

IQueryable<ObjectType> query2 = getIQueryableSomehow() 
query2.Where(x => x.B); 

IQueryable<ObjectType> query3 = query.ToArray().AsQueryable<ObjectType>().Union(query2);

Это будет хорошо работать, пока ваши результаты не слишком велики.

...