【问题标题】:Multiple .Where() clauses on an Entity Framework Queryable实体框架上的多个 .Where() 子句可查询
【发布时间】:2016-01-02 03:44:13
【问题描述】:

我正在尝试使用实体框架实现一个复杂的过滤器:我想根据我提供的搜索条件将where 子句添加到可查询对象。

我可以在 Entity Framework 6 中执行以下操作吗?

var queryable = db.Users.Where(x => x.Enabled && !x.Deleted);
// Filter
var userId = User.Identity.GetUserId();
queryable.Where(x => x.AspNetUser.Id == userId);
queryable.Where(x => x.Status >= 2); 
// ...etc

我知道我能做到:

var queryable = db.Users
 .Where(x => x.Enabled && !x.Deleted)
 .Where(x => x.AspNetUser.Id == userId)
 .Where(x => x.Status >= 2); 

但是我没有通过这个解决方案获得预期的结果。似乎忽略了两个where 子句的秒数。

【问题讨论】:

  • 你需要给结果赋值,比如:queryable = queryable.Where(x => x.AspNetUser.Id == userId); 顺便说一句,你可以使用and (&&),避免写多个where子句。
  • @Akbari,这应该是一个答案

标签: c# entity-framework entity-framework-6


【解决方案1】:

.Where 返回一个可查询的,它不会修改原来的。所以你只需要保存新的可查询对象。

var queryable = db.Users.Where(x => x.Enabled && !x.Deleted);
// Filter
var userId = User.Identity.GetUserId();
queryable = queryable.Where(x => x.AspNetUser.Id == userId);
queryable = queryable.Where(x => x.Status >= 2); 
// ...etc

【讨论】:

  • 这很好,但会构建一个 AND 子句。创建多个 OR 条件并不简单。
【解决方案2】:

我猜你正在尝试的是运行时搜索。如果是这种情况,您有两个选择。

  1. 使用表达式构建运行时 where 子句。您可能必须使用谓词构建器。 This 谓词生成器可能不适用于实体框架。但是this one 应该与实体框架一起使用。

  2. 使用Dynamic Linq。这是迄今为止最简单的。它用途广泛。你不仅可以做Where,它还支持select和order by等以及运行时非常容易!!!看看吧。

【讨论】:

    猜你喜欢
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    • 2020-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 2010-10-06
    相关资源
    最近更新 更多