Linq 查询中的有线代理运算符
wired acting operators in Linq query
这是我的查询:
db.Users.Where(u =>
( u.Mobile.Contains(SearchStr)
|| u.FirstName.ToLower().Contains(SearchStr.ToLower())
|| u.LastName.ToLower().Contains(SearchStr.ToLower())
|| (u.Email.Contains(SearchStr)
)
&& (u.Type == SearchType || SearchType == 0)
&& (Confirmed == null || Confirmed == u.IsVerified)
&& (Banned == null || Banned == u.IsDeleted)
)
此列表忽略 Confirmed
、Banned
和 SearchType
的所有用户。无论这些值是 null
、true
还是 false
,结果都是相同的
If SearchType == 0 or Confirmed == null or Banned == null
在任何时候,它都会 return 一切。很有可能是这样
除去那些条件,你应该很好
这里更多的是评论然后回答,但想显示可能有助于 OP 调试的代码
db.Users.Where(u =>ISPassed(u));
private bool IsPassed(User u)
{
// put a debugger here
return ( u.Mobile.Contains(SearchStr)
|| u.FirstName.ToLower().Contains(SearchStr.ToLower())
|| u.LastName.ToLower().Contains(SearchStr.ToLower())
|| (u.Email.Contains(SearchStr)
)
&& (u.Type == SearchType || SearchType == 0)
&& (Confirmed == null || Confirmed == u.IsVerified)
&& (Banned == null || Banned == u.IsDeleted));
}
我认为问题出在此处的左括号
(u.Email.Contains(SearchStr)
这基本上使条件类似于 A OR B OR C AND D AND E AND F
。我不知道(我什至不想知道)这样的逻辑表达式是如何计算的,很可能结果不是你所期望的。
试试这个
var query = db.Users.Where(u =>
(u.Mobile.Contains(SearchStr)
|| u.FirstName.ToLower().Contains(SearchStr.ToLower())
|| u.LastName.ToLower().Contains(SearchStr.ToLower())
|| u.Email.Contains(SearchStr)
)
&& (u.Type == SearchType || SearchType == 0)
&& (Confirmed == null || Confirmed == u.IsVerified)
&& (Banned == null || Banned == u.IsDeleted)
);
我看生成的sql如Ivan Stoev所说。
添加另一对括号解决了问题,但我仍然不明白逻辑,为什么以前没有工作,为什么现在工作
db.Users.Where(
u =>
(( u.Mobile.Contains(SearchStr) //added the parantheses in here
|| u.FirstName.ToLower().Contains(SearchStr.ToLower())
|| u.LastName.ToLower().Contains(SearchStr.ToLower())
|| (u.Email.Contains(SearchStr)
)) //and here
&& (u.Type == SearchType || SearchType == 0)
&& (Confirmed == null || Confirmed == u.IsVerified)
&& (Banned == null || Banned == u.IsDeleted)
))
这是我的查询:
db.Users.Where(u =>
( u.Mobile.Contains(SearchStr)
|| u.FirstName.ToLower().Contains(SearchStr.ToLower())
|| u.LastName.ToLower().Contains(SearchStr.ToLower())
|| (u.Email.Contains(SearchStr)
)
&& (u.Type == SearchType || SearchType == 0)
&& (Confirmed == null || Confirmed == u.IsVerified)
&& (Banned == null || Banned == u.IsDeleted)
)
此列表忽略 Confirmed
、Banned
和 SearchType
的所有用户。无论这些值是 null
、true
还是 false
If SearchType == 0 or Confirmed == null or Banned == null
在任何时候,它都会 return 一切。很有可能是这样
除去那些条件,你应该很好
这里更多的是评论然后回答,但想显示可能有助于 OP 调试的代码
db.Users.Where(u =>ISPassed(u));
private bool IsPassed(User u)
{
// put a debugger here
return ( u.Mobile.Contains(SearchStr)
|| u.FirstName.ToLower().Contains(SearchStr.ToLower())
|| u.LastName.ToLower().Contains(SearchStr.ToLower())
|| (u.Email.Contains(SearchStr)
)
&& (u.Type == SearchType || SearchType == 0)
&& (Confirmed == null || Confirmed == u.IsVerified)
&& (Banned == null || Banned == u.IsDeleted));
}
我认为问题出在此处的左括号
(u.Email.Contains(SearchStr)
这基本上使条件类似于 A OR B OR C AND D AND E AND F
。我不知道(我什至不想知道)这样的逻辑表达式是如何计算的,很可能结果不是你所期望的。
试试这个
var query = db.Users.Where(u =>
(u.Mobile.Contains(SearchStr)
|| u.FirstName.ToLower().Contains(SearchStr.ToLower())
|| u.LastName.ToLower().Contains(SearchStr.ToLower())
|| u.Email.Contains(SearchStr)
)
&& (u.Type == SearchType || SearchType == 0)
&& (Confirmed == null || Confirmed == u.IsVerified)
&& (Banned == null || Banned == u.IsDeleted)
);
我看生成的sql如Ivan Stoev所说。 添加另一对括号解决了问题,但我仍然不明白逻辑,为什么以前没有工作,为什么现在工作
db.Users.Where(
u =>
(( u.Mobile.Contains(SearchStr) //added the parantheses in here
|| u.FirstName.ToLower().Contains(SearchStr.ToLower())
|| u.LastName.ToLower().Contains(SearchStr.ToLower())
|| (u.Email.Contains(SearchStr)
)) //and here
&& (u.Type == SearchType || SearchType == 0)
&& (Confirmed == null || Confirmed == u.IsVerified)
&& (Banned == null || Banned == u.IsDeleted)
))