Поддерживает ли LINQ составные «ИЛИ запросы»? - PullRequest
3 голосов
/ 15 декабря 2008

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

Ответы [ 4 ]

6 голосов
/ 15 декабря 2008

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

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 голосов
/ 15 декабря 2008

А как насчет использования 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);
1 голос
/ 03 ноября 2009

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

Содержит операции в службах данных ADO.NET, часть I

Содержит операции в службах данных ADO.NET, часть II

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

1 голос
/ 13 февраля 2009

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

...