Linq Where() lambda表达式中的“Or”等效语句

106

在Linq中有一种方法可以用来构建SQL字符串,类似于“...where (a=1) OR (a=2)”吗?


6
我假设您知道如何使用 || 并且想要一些动态的内容,比如 a=a.where(hour=> hour<20); if(weekend) a=a.where(hour=> hour>6);。您可能希望更清楚地说明这一点... - Kobi
一个早期的问题,有不同的解决方案:https://dev59.com/mnNA5IYBdhLWcg3wgeOk - GSerg
6个回答

208

你可以在Where子句(扩展方法)中完成它。但是,如果您需要动态构建复杂查询,可以使用PredicateBuilder

 var query = collection.Where( c => c.A == 1 || c.B == 2 );
使用PredicateBuilder进行操作。
 var predicate = PredicateBuilder.False<Foo>();
 predicate = predicate.Or( f => f.A == 1 );
 if (allowB)
 {
    predicate = predicate.Or( f => f.B == 1 );
 }

 var query = collection.Where( predicate );

这个非常好用,因为我需要根据传入参数的值来构建我的 Or -- 太棒了! - Mark
非常酷。遗憾的是,这不作为.NET标准函数包含在内。 - maxp
1
非常棒的实现,尽管可能没有注意到这仅适用于C# 5+。 - Thomas.Donnelly
1
我相信在将谓词传递给 .Where 之前,必须先进行编译。 - test

28

您可以在单个where子句中使用标准的.NET布尔运算符:

MyDataSource.Where(data => data.a == 'a' || data.a == 'b')

20

你使用与普通C#相同的运算符 ===> || 表示 "或",&& 表示 "且" 等等。

var something = from s in mycollection
                where s.something == 32 || 
                      s.somethingelse == 45 
                select s

1
在你的.Where()调用中使用标准布尔“或”运算符||
var query = items.Where(item => (item == 1 || item == 2));

Where调用所做的只是对您想要的任何东西进行布尔比较,因此您可以填充任意多的条件逻辑。


0
如果您不知道参数计数,可以使用以下方法:
示例数据
var parameters= new List<string>{"a","d"};
var sampledata = new Dictionary<string,string>();
    sampledata["a"] = "A";
    sampledata["b"] = "B";
    sampledata["c"] = "C";
    sampledata["d"] = "D";

代码

var query = sampledata.AsQueryable();
var firstItemKey = sampledata.FirstOrDefault().Key;
var queryresult= sampledata.Where(x => x.Key == firstItemKey).AsQueryable();
foreach (var parameter in parameters.Skip(1))
{
    queryresult=queryresult.Concat(query.Where(x => x.Key == parameter));
}
var result = queryresult.ToList();

-1

现在已经内置到 .net 中了,不确定以前是否有。给定一个现有的 Linq 查询,您可以添加一个 where 子句,该子句接受一个字符串数组(SearchStrings),并检查它们中的任何一个是否与您搜索的集合中的任何对象匹配。使用 ToLower() 只是确保您在 SQL 查询中避免大小写敏感。

query.Where(i => SearchStrings.Any(s => i.ToLower().Contains(s.ToLower()));

对于“and”谓词,您可以通过将数组中的所有单词与集合对象进行匹配来执行相同的操作。

query.Where(i => SearchStrings.All(s => i.ToLower().Contains(s.ToLower()));

在这个例子中,i 对应于集合中的每个对象,s 对应于 SearchStrings 数组中的每个字符串。

1
请注意,“任何”无法由EF提供程序翻译,因此将在本地评估,从而导致完整的表扫描和内存过滤。 - Wade Bee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接