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

Posted

技术标签:

【中文标题】Linq Where() lambda 表达式中的“或”等价物【英文标题】:"Or" equivalent in Linq Where() lambda expression 【发布时间】:2011-01-07 06:37:42 【问题描述】:

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

【问题讨论】:

我假设你知道如何使用|| 并且想要动态的东西,比如a=a.where(hour=> hour<20); if(weekend) a=a.where(hour=> hour>6);。您可能想更清楚地说明... 一个较早的问题有不同的解决方案:***.com/q/930677/11683 【参考方案1】:

您当然可以在 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 ——太棒了! 非常酷。遗憾的是,它没有作为标准包含在 .NET 中。 非常好的实现,尽管可能没有注意到这仅适用于 C# 5+。 我相信您必须先将谓词.Compile 传递给.Where【参考方案2】:

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

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

【讨论】:

【参考方案3】:

您使用与普通 C# 中所有相同的运算符 ===> ||用于“或” && 用于“和”等

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

【讨论】:

【参考方案4】:

在您的.Where() 调用中使用标准布尔“或”运算符||

var query = items.Where(item => (item == 1 || item == 2));

所有 Where 调用都是对任何你想要的东西进行布尔比较,所以你可以用尽可能多的条件逻辑来填充它。

【讨论】:

【参考方案5】:

如果你不知道参数计数,你可以使用这个:

样本数据

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();

【讨论】:

【参考方案6】:

现在.net 内置了,不确定以前是否没有。给定一个现有的 Linq 查询,您可以添加一个接受字符串数组 (SearchStrings) 的 where 子句,并检查它们中的任何一个是否与您正在搜索的集合中的任何对象匹配。使用 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 数组中的每个字符串相关。

【讨论】:

请注意,'Any' 无法由 EF 提供程序翻译,将在本地进行评估,从而导致全表扫描和内存过滤。

以上是关于Linq Where() lambda 表达式中的“或”等价物的主要内容,如果未能解决你的问题,请参考以下文章

如何解决 C# 中 linq 的 lambda 表达式中的对象引用错误?

如何为CriteriaOperator过滤对象转换为lambda表达式,即:linq to xpo的动态where语句

在 lambda 表达式中检查 null - linq

LAMBDA表达式常用 (全)

EF的连表查询Lambda表达式和linq语句(转)

Lambda表达式中 select 怎么动态添加查询字段