首页 > 解决方案 > 使用多个 where 的实体框架 Linq 查询

问题描述

多个 .Where() 是否充当 AND (&&) 或充当 Or (||) 例如:

 var db = new myContext();
 var query = db.User.Where(u => u.Gender == "Male");
 query = query.Where(u => u.IsActive == true);

是否等同于:

   Select *
   from user
   where gender = 'Male' 
     and IsActive = true;

标签: c#entity-frameworklinqfilter

解决方案


您将一个过滤器的结果传递给另一个过滤器,因此从逻辑上讲,它们将像“和”一样。

假设你有一副牌。然后,您使用只给您红牌的“过滤器”。然后,您希望将结果传递给另一个过滤器,该过滤器只为您提供七人制。

因此,您有效地获得了红色且价值为 7 的卡片。

有没有办法改变这种行为并使其充当“或”?

不,没有办法获取具有Where子句的查询并“附加”第二个Where子句,其作用类似于or.

如果您尝试使用“或”操作动态附加过滤器,最直接的方法是将两个谓词与“或”组合(请参阅Linq Where() lambda 表达式中的“或”等效项

另一种方法是重新使用原始查询,使用两个单独 Where的查询和Union结果。

var result1 = a.Where(u => u.Gender == "Male");
var result2 = a.Where(u => u.IsActive == true);

var result = result1.Union(result2);

但是这种“间接” OR 子句可能存在性能问题


推荐阅读