3

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

当我运行这个 LINQ to Entity 命令时,它可以像我希望的那样工作。它返回所有用户,按以下内容过滤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”。当我直接查询数据库时 - 我返回 6 个用户。如果用户集合对象已经填充(有 100 个用户)并且我尝试过滤集合 - 返回 0 个用户

4

3 回答 3

2

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

于 2013-06-20T10:21:05.337 回答
1

该集合是否_users包含任何用户(过滤之前)?另外,您的查询对我来说很奇怪,如果我错了,请纠正我:

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

我把它读成:

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

于 2013-06-20T10:17:04.100 回答
1

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

  1. 如果txtFilterBy_UserName.Value.Length > 0,那么您只想返回用户名包含的用户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();
于 2013-06-20T10:22:18.370 回答