如何使用列表针对实体框架类进行查询
本文关键字:查询 框架 实体 何使用 列表 | 更新日期: 2024-11-08 15:44:00
我对linq有点了解,但我需要能够有一个由代码填充的列表,并使用linq表达式"迭代"它,可以这么说,并将其与数据库行进行比较。
这是我当前的代码
foreach (IdentityReference group in windowsIdentity.Groups)
{
string groupName = group.Translate(typeof(NTAccount)).ToString();
//Query the db for the role(s) associated with this groupname
var query = from adGroup in AuthDbContext.ADGroups
from adGroupRole in AuthDbContext.ADGroupRoles
where adGroup.Name == groupName
&& adGroup.Id == adGroupRole.ADGroupId
select adGroupRole.Role.Name
;
//Add any found roles as claims to be added to the identity
foreach (string Role in query)
{
claims.Add(new Claim(ClaimTypes.Role, Role));
}
}
但是我想通过生成一个string[]
(从 windowsIdentity.Groups
)并以某种方式在 linq 中使用它来将每个字符串条目(组名)与 where 子句进行比较来消除第一个 foreach 循环。
我想这样做,因为我假设每次运行查询时它都会命中数据库,这意味着如果有 50 个组,它将命中 db 50 次。如果它都在一个表达式中,我认为它只会命中数据库一次。
执行此操作的正确 Linq 查询语法是什么?
仔细观察:
string[] groupNames = windowsIdentity.Groups.Select(g=> g.Translate(typeof(NTAccount)).ToString()).ToArray();
//Query the db for the role(s) associated with this groupname
var query = from adGroup in AuthDbContext.ADGroups
join adGroupRole in AuthDbContext.ADGroupRoles on adGroup.Id equals adGroupRole.ADGroupId
where groupNames.Contains(adGroup.Name)
select adGroupRole.Role.Name;
//Add any found roles as claims to be added to the identity
foreach (string Role in query)
{
claims.Add(new Claim(ClaimTypes.Role, Role));
}
假设声明是列表<声明>或声明的某个超类型,则可以使用以下方法一次添加它们:声明>
claims.AddRange(query.Select(r=> new Claim(ClaimTypes.Role, r)));