在另一个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提供)正是我正在寻找的功能方面。我确实遇到了两个可能的问题:
答案 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);
}