LINQ到实体-解析/过滤对象集合

本文关键字:过滤 对象 集合 解析 实体 LINQ | 更新日期: 2023-09-27 18:19:06

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

当我运行这个LINQ到实体命令时,它像我所希望的那样工作。它返回所有用户,通过txtFilterBy_UserName:

中的内容进行过滤。

(注意我是直接访问db表的。还有几个字段需要过滤,但在这个例子中我只包括用户名)

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"。当我直接查询DB时-我返回6个用户。如果用户集合对象已经填充(有100个用户)并且我尝试过滤集合- 0用户返回

LINQ到实体-解析/过滤对象集合

不使用三元运算符进行过滤,只需通过有条件地添加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集合中没有任何符合您条件的用户。

collection _users是否包含任何用户(在过滤之前)?此外,你的查询看起来很奇怪,如果我错了,请纠正我:

u.UserName.ToLower().Contains((txtFilterBy_UserName.Value.Length > 0)
                              ? u.UserName.ToLower()
                              : txtFilterBy_UserName.Value.ToLower())

我把它读作:

如果过滤器文本框有一个值(长度> 0),给出所有用户的小写用户名包含该用户的小写用户名,否则(如果没有提供过滤器值)给出小写用户名包含空值(字符串)的所有用户。

看起来您的查询有点混淆。看看你的代码,我怀疑你想这样做:

  1. 如果txtFilterBy_UserName.Value.Length > 0true那么你只想返回用户名包含txtFilterBy_UserName.Value的用户。基本上你会做过滤。
  2. 如果txtFilterBy_UserName.Value.Length > 0false则您希望返回所有用户。

如果我的假设是正确的,你可以重写你的查询如下:

users = db.Users.Where(u => u.IsActive == true);
if (txtFilterBy_UserName.Value.Length > 0))
{
    users = users.Where(u => u.UserName.ToLower().Contains(txtFilterBy_UserName.Value.ToLower()));
}
users = users.ToList();