【问题标题】:LINQ to Entities - parse / filter object collectionLINQ to Entities - 解析/过滤对象集合
【发布时间】:2013-06-20 10:06:06
【问题描述】:

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

当我运行这个 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 个用户

【问题讨论】:

    标签: c# linq linq-to-entities


    【解决方案1】:

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

    【讨论】:

    • 非常感谢这个解决方案 - 我非常想用这么少的代码让它工作,但这更有意义并且有效!
    【解决方案2】:

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

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

    我是这样理解的:

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

    【讨论】:

    • +1 用于指向奇怪的查询。顺便说一句 _users 不必为空 - 它不可能有用户匹配条件
    • 我认为我们有点跑题了,但我想解释一下这条线应该做什么。 (txtFilterBy_UserName(和其他过滤器)中有一个水印)如果过滤器文本框包含一个值(并且该值不是“用户名”),则返回数据库中与 txtFilterBy_UserName 中的值匹配的用户,否则返回全部用户,无论他们是否有用户名......这是我的全部条件。 u.UserName.ToLower().Contains(((txtFilterBy_UserName.Value.Length > 0) && (txtFilterBy_UserName.Value.ToLower() == "用户名")) ? u.UserName.ToLower() : txtFilterBy_UserName.Value.ToLower ())
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 2011-06-10
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 2011-08-28
      • 2014-05-07
      相关资源
      最近更新 更多