繁体   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