c# - LINQ to Entities - 解析/过滤对象集合

标签 c# linq linq-to-entities

我正在尝试从我的数据库中过滤用户列表。

当我运行此 LINQ to Entity 命令时,它如我所愿地工作。它返回所有用户,按 txtFilterBy_UserName 中的任何内容过滤:

(请注意,我是直接访问数据库表。还有几个要过滤的字段,但在此示例中我只包括用户名)

users = db.Users
          .Where(u => u.IsActive == true &&
                      u.UserName.ToLower()
                       .Contains((txtFilterBy_UserName.Value.Length > 0) ? 
                                  u.UserName.ToLower() : 
                                  txtFilterBy_UserName.Value.ToLower()))
          .ToList();

但是...在某些情况下,我已经在过滤之前填充了我的用户集合 (_users),我希望能够这样做:

users = _users.Where(u => u.IsActive == true && 
                          u.UserName.ToLower()
                           .Contains((txtFilterBy_UserName.Value.Length > 0) ?
                                      u.UserName.ToLower() :
                                      txtFilterBy_UserName.Value.ToLower()))
              .ToList();

但是这种方法总是返回 0 个用户,谁能告诉我我做错了什么,或者为什么这种过滤用户集合的方法不起作用?

假设我的数据库中有 100 个用户,其中 6 个用户的用户名中包含字符“john”。当我直接查询数据库时 - 我返回 6 个用户。 如果用户集合对象已经填充(有 100 个用户)并且我尝试过滤集合 - 返回 0 个用户

最佳答案

不是使用三元运算符进行过滤,而是通过有条件地添加 Where 过滤器来简单地组成您的查询:

var query = _users.Where(u => u.IsActive); // don't compare boolean with true
if (txtFilterBy_UserName.Value.Length > 0)
    query = query.Where(u => u.UserName.ToLower().Contains(txtFilterBy_UserName.Value.ToLower()));

var users = query.ToList();

是的,我同意@Abbas - 你的查询看起来不错。可能您在本地 _users 集合中没有任何用户符合您的条件。

关于c# - LINQ to Entities - 解析/过滤对象集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17210886/

相关文章:

c# - 使用简单注入(inject)器自动注册通用存储库

c# - RabbitMQ 向所有消费者广播事件

c# 根据日期列表查找开始日期和结束日期?

c# - LINQ SelectMany 和 Where 扩展方法忽略空值

c# - Join with Where 子句的查询和方法 (lambda) 语法的等效性

c# - 通过 ADO.NET Entity Framework 使用静态数据访问方法

c# - ASP.NET - 如何使用 MVC 模式通过服务器端代码 (C#) 加载页面?

c# - 仅使用扩展方法在 Linq 中进行漂亮、干净的交叉连接

linq - 是否可以在没有LINQ的情况下使用 Entity Framework ?

c# - 在集合中封装引用类型