[英].Where inside a .Select , how to select only record that match the where clause:-
我有以下两句话:
var isadminByuser = tms.SecurityRoles.Where(a => a.Name.ToLower() == "administrator")
.Select(a=>a.SecurityRoleUsers.Where(a2 => a2.UserName.ToLower() == user.ToLower()));
if (isadminByuser.Count() >= 1) { return true;}
&
var adminByGroup = tms.SecurityRoles.Where(a => a.Name == "Administrator")
.SingleOrDefault().Groups
.Select(a2 => a2.TMSUserGroups
.Where(a3 => a3.UserName.ToLower() == user.ToLower()));
bool isadminByGroup = adminByGroup.Count() >= 1;
即使where子句a3.UserName.ToLower() == user.ToLower()))
为false
,第一个isadminByuser
将始终具有元素(始终为> = 1),而另一个var的计数为零是where子句( a3.UserName.ToLower() == user.ToLower())
)是假的。 那么,为什么第一个变量永远不会计数为零?
谢谢
所提出问题的答案是,当您选择a.SecurityRoleUsers.Where(a2 => a2.UserName.ToLower() == user.ToLower())
时,您正在选择IQueryable<SecurityRoleUsers>
。
它的计数可能为0,也可能不为0,但是包含的查询将为每个与Name = "administrator"
相匹配的SecurityRole
返回这些IQueryables
之一,因此,如果至少有一个匹配的SecurityRole
,则计数将始终为1+
更新:
// first get SecurityRoles
bool isadminByuser = tms.SecurityRoles.Where(a => a.Name.ToLower() == "administrator")
// now you're only interested in the related SecurityRoleUsers
.SelectMany( a => a.SecurityRoleUsers )
// now check if any of the SecurityRoleUsers meet your criteria
.Any( sru => sru.UserName.ToLower() == user.ToLower() );
您能否观察到与ms-sql-profiler的sql查询差异
tms.SecurityRoles.Where(a => a.Name.ToLower() == "administrator")
.Select(a=>a.SecurityRoleUsers.Where(a2 => a2.UserName.ToLower() == user.ToLower()));
***
tms.SecurityRoles.Select(a=>a.SecurityRoleUsers.Where(a2 => a2.UserName.ToLower() == user.ToLower())).Where(a => a.Name.ToLower() == "administrator");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.