Linq Where()lambda表达式中的“或”等价物


91

Linq中是否有一种方法可以用来构建SQL字符串,例如“ ... where(a = 1)OR(a = 2)”?


4
我假设您知道如何使用||并想要动态的东西,例如a=a.where(hour=> hour<20); if(weekend) a=a.where(hour=> hour>6);。您可能想更清楚地说一下...
Kobi 2010年

Answers:


189

您当然可以在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,这太棒了!
2012年

很酷。遗憾的是,作为标准.NET并未包含此功能。
maxp

1
非常好的实现,尽管可能没有注意到,但这仅适用于C#5+。
Thomas.Donnelly,2015年

25

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

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

19

使用与普通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查询,您可以添加一个带字符串数组(SearchStrings)的where子句,并检查它们是否与您要搜索的集合中的任何对象匹配。使用ToLower()仅可确保避免在SQL查询中区分大小写。

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

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

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

在此示例中,i与集合中的每个对象相关,而s与SearchStrings数组中的每个字符串相关。


1
请注意,“任何”都不能由EF提供​​程序翻译,并且会在本地进行评估,从而进行全表扫描和内存中过滤。
韦德·贝
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.