Поддерживает ли LINQ составные «ИЛИ запросы»?

В другой публикации: Поддерживает ли Linq-To-Sql составные запросы, обсуждалась, как динамически составлять / объединять предложения. По-видимому, это делается с помощью «И» (т. Е. Первое предложение «где» и второе предложение «где» объединяются с помощью И). Что мне интересно, так это то, что существует ли способ составления запросов 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

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

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

РЕДАКТИРОВАТЬ : Предложение Союза (Гарри Шатлер) именно то, что я ищу в плане функциональности. Я столкнулся с двумя возможными проблемами с ним:

  1. Похоже, что это сделало бы несколько обращений к базе данных, если бы я выполнил третье условие (кажется, что union принимает в качестве параметра IEnumerable) - я надеялся создать несколько операторов AND и OR в коде и затем выполнить один запрос.
  2. Союз не поддерживается ADO.Net Data Services (очень разочаровывает)
15.12.2008 06:46:32
4 ОТВЕТА
РЕШЕНИЕ

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

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 может быть достаточно умен, чтобы преобразовать это в ИЛИ, но я не уверен.

6
15.12.2008 10:03:53

Как насчет использования PredicateBuilder Джо Албахари?

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

var query = Person.Where(predicate);
2
15.12.2008 11:22:27
Конструктор предикатов не поддерживает службы данных ADO.Net? Выполнение вышеуказанного приводит к: «Ошибка перевода выражения Linq в URI: выражение ((False или Invoke (m => m.FirstName =« Daniel »), [10007])) или Invoke (p => (p.age < 18), [10007])) не поддерживается. "
ChrisHDog 15.12.2008 23:23:00
На самом деле это означает, что ошибка в Linq для ADO.NET Data Services, поскольку она не поддерживает или выражений.
Cameron MacFarland 16.12.2008 01:18:13

Опция предиката - это путь. Опция Union не создает хороший sql. Ссылка http://social.msdn.microsoft.com/forums/en-US/linqprojectgeneral/thread/925b245d-5529-4a64-8cd4-4bc83ee6fe7a/

1
13.02.2009 20:19:35
Похоже, что Linq для ADO.Net Data Services не поддерживает построитель выражений / предикатов (подробности см. В комментариях к сообщению Кэмерона МакФарланда), поэтому в этой ситуации это не сработает - возможно, придется просто подождать, пока Linq перейдет в ADO.Net Службы данных для поддержки этой функциональности.
ChrisHDog 15.02.2009 23:11:17

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

Содержит операции в ADO.NET Data Services, часть I

Содержит операции в ADO.NET Data Services, часть 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);
}

1
3.11.2009 20:02:56