2008-12-15 5 views
3

В другом posting: Does Linq-To-Sql support composable queries была дискуссия о том, как составлять/concat где клаузулы динамически. Это, по-видимому, выполняется с помощью «И» (то есть первое предложение where, а второе предложение where объединяется с AND). Мне интересно, есть ли способ составить запросы Linq с помощью OR.Поддерживает ли LINQ поддержку «ИЛИ запросов»?

Пример:

var people = from p in Person 
      where p.age < 18 
      select p 

var otherPeople = from p in people 
        where p.firstName equals "Daniel" 
        select p 

Это дает людям с первым названием «Daniel», и которые находятся под 18. Я ищу синтаксисом, чтобы присоединиться к этим, чтобы найти людей, которые имеют первое имя " Даниил "или находятся под 18.

Примечание: Я использую службы данных ADO.net, поэтому у меня нет. Содержит() для меня.

EDIT: The Union Suggestion (Garry Shutler) - это именно то, что я ищу по функциональности. Я побежал на две возможные проблемы с ним:

  1. Похоже, что бы сделать несколько хитов базы данных, если я должен был сделать третье условие (союз, кажется, принять IEnumerable в качестве параметра) - я надеялся построить несколько операторов AND и OR в коде, а затем выполните один запрос.
  2. Союз не поддерживается ADO.Net Data Services (очень неутешительными)

ответ

6

, что вы хотите так же просто, как:

var people = from p in Person 
      where p.age < 18 || p.firstName == "Daniel" 
      select p; 

или вы просто дали простой пример?

В этом случае вы можете использовать:

var under18 = from p in Person 
       where p.age < 18 
       select p; 

var daniels = from p in Person 
       where p.firstName == "Daniel" 
       select p; 

var combined = under18.Union(daniels); 

LinqToSql может быть достаточно умна, чтобы преобразовать его в ОШ, но я не так уверен.

2

Как насчет использования PredicateBuilder от Joe Albahari?

var predicate = PredicateBuilder.False<Person>(); 
predicate = predicate.Or(p => p.age < 18); 
predicate = predicate.Or(p => p.firstName == "Daniel"); 

var query = Person.Where(predicate); 
+0

Predicate Builder не отображается для поддержки службы данных ADO.NET? Выполнение приведенных выше результатов: «Ошибка перевода выражения Linq в URI: выражение ((False или Invoke (m => m.FirstName =« Daniel »), [10007])) или Invoke (p => (p.age < 18), [10007])) не поддерживается ». – ChrisHDog 2008-12-15 23:23:00

+0

Фактически это означает, что ошибка в Linq для ADO.NET Data Services, поскольку она не поддерживает или выражения. – 2008-12-16 01:18:13

1

Я написал о том, как достичь запросов, которые ищут ключевое значение в наборе в моем блоге. Вот ссылки.

Contains Operations in ADO.NET Data Services Part I

Contains Operations in ADO.NET Data Services Part II

Используя это, вы можете писать запросы, которые выглядят как этот
//The set in which we have to search for a match
List<string> citiesIWillVisit = new List<string>() {"London","Berlin","Prague"};
var customersAround = nwContext.Customers
.IsIn<Customers>(citiesIWillVisit, c=> c.City);
foreach (Customers localCustomer in customersAround) {
System.Console.WriteLine(localCustomer.ContactName);
}