LINQ是否支持可组合“或查询”?

时间:2008-12-15 06:46:33

标签: linq wcf-data-services where-clause

在另一个posting: Does Linq-To-Sql support composable queries中讨论了如何动态地组合/连接where子句。这似乎是用“AND”完成的(即第一个where子句和第二个where子句由AND连接)。我想知道的是,是否有办法用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岁的人。我正在寻找加入这些名称的语法,以找到名字为“Daniel”或未满18岁的人。

注意:我使用的是ADO.net数据服务,所以我没有.Contains()可供我使用。

编辑:联盟建议(由Garry Shutler提供)正是我正在寻找的功能方面。我确实遇到了两个可能的问题:

  1. 如果我要做第三个条件(联合似乎将IEnumerable作为其参数),它看起来会产生多个数据库命中 - 我希望在代码中构建多个AND和OR语句然后执行一个请求
  2. ADO.Net Data Services不支持Union(非常令人失望)

4 个答案:

答案 0 :(得分: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可能足够聪明,可以将其转换为OR,但我不太确定。

答案 1 :(得分:2)

使用Joe Albahari的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 :(得分:1)

谓词选项是要走的路。 Union选项不能构建好的sql。参考http://social.msdn.microsoft.com/forums/en-US/linqprojectgeneral/thread/925b245d-5529-4a64-8cd4-4bc83ee6fe7a/

答案 3 :(得分: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);
}