Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ到实体-解析/筛选对象集合_C#_Linq_Linq To Entities - Fatal编程技术网

C# LINQ到实体-解析/筛选对象集合

C# LINQ到实体-解析/筛选对象集合,c#,linq,linq-to-entities,C#,Linq,Linq To Entities,我正在尝试从数据库中筛选用户列表 当我运行这个linqtoentity命令时,它就像我希望的那样工作。它返回所有用户,通过txtFilterBy_UserName中的任何内容进行过滤: (请注意,我是直接访问db表的。还有几个字段需要筛选,但在本例中我只包括用户名) 但是。。。在某些情况下,我已经在筛选之前填充了我的用户集合(\u users),我希望能够做到这一点: users = _users.Where(u => u.IsActive == true &&

我正在尝试从数据库中筛选用户列表

当我运行这个linqtoentity命令时,它就像我希望的那样工作。它返回所有用户,通过
txtFilterBy_UserName
中的任何内容进行过滤:

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

但是。。。在某些情况下,我已经在筛选之前填充了我的用户集合(
\u 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个用户

集合
\u用户
是否包含任何用户(筛选之前)?另外,我觉得你的问题很奇怪,如果我错了,请纠正我:

u.UserName.ToLower().Contains((txtFilterBy_UserName.Value.Length > 0)
                              ? u.UserName.ToLower()
                              : txtFilterBy_UserName.Value.ToLower())
我的理解是:


如果筛选文本框有一个值(长度>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的说法——你的问题看起来很好。在本地
\u 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();
  • 如果
    txtFilterBy\u UserName.Value.Length>0
    true,则您只希望返回包含
    txtFilterBy\u UserName.Value
    的用户名。基本上,您将进行过滤
  • 如果
    txtFilterBy_UserName.Value.Length>0
    false,则您希望返回所有用户。这里不应用任何过滤器
  • 如果我的假设是正确的,您可以将查询重写如下:

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

    +1用于指向奇怪的查询。顺便说一句,用户不必为空-它不能有匹配条件的用户。我想我们有点离题了,但我想解释一下这行应该做什么。(txtFilterBy_UserName(和其他筛选器)中包含水印)如果筛选器文本框包含值(且该值不是“UserName”),则返回数据库中与txtFilterBy_UserName中的值匹配的所有用户,否则返回所有用户,无论他们是否有用户名。。。这是我的全部情况。u、 UserName.ToLower().Contains(((txtFilterBy_UserName.Value.Length>0)和&(txtFilterBy_UserName.Value.ToLower()=“UserName”)?u.UserName.ToLower():txtFilterBy_UserName.Value.ToLower())非常感谢这个解决方案-我非常渴望尝试用如此少的代码来实现它,但这更有意义,而且有效!