簡體   English   中英

在.Select內的位置,如何僅選擇與where子句匹配的記錄:

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM