3

在另一个帖子中:Linq-To-Sql 是否支持可组合查询,讨论了如何动态组合/连接 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()。

编辑:Union Suggestion(Garry Shutler)正是我正在寻找的功能。我确实遇到了两个可能的问题:

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

4 回答 4

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,但我不太确定。

于 2008-12-15T10:03:53.323 回答
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);
于 2008-12-15T11:22:27.267 回答
1

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

于 2009-02-13T20:19:35.233 回答
1

我在我的博客上写了关于如何实现在集合中搜索键值的查询。以下是相关链接。

包含 ADO.NET 数据服务第一部分中的操作

包含 ADO.NET 数据服务第 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);
}

于 2009-11-03T20:02:56.500 回答