[英].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.