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

时间:2013-06-20 10:06:07

标签: c# linq linq-to-entities

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

当我运行这个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个用户。 如果已经填充了users集合对象(有100个用户),我尝试过滤集合 - 返回0个用户

3 个答案:

答案 0 :(得分: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集合中符合您的条件。

答案 1 :(得分:1)

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

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

我读到这个:

如果filter-textbox有一个值(Length> 0),请告诉我所有用户,其中任何用户的小写用户名包含该用户的小写用户名,否则(如果没有提供过滤器值)给我全部小写用户名包含空值(字符串)的用户。

答案 2 :(得分:1)

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

  1. 如果txtFilterBy_UserName.Value.Length > 0 为真,那么您只想返回用户名包含txtFilterBy_UserName.Value的用户。基本上你会做过滤。
  2. 如果txtFilterBy_UserName.Value.Length > 0 false ,则您希望返回所有用户。在这里,您不应用任何过滤器。
  3. 如果我的假设是正确的,您可以按如下方式重写查询:

    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();