C# LINQ到实体-解析/筛选对象集合
我正在尝试从数据库中筛选用户列表 当我运行这个linqtoentity命令时,它就像我希望的那样工作。它返回所有用户,通过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 &&
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())非常感谢这个解决方案-我非常渴望尝试用如此少的代码来实现它,但这更有意义,而且有效!