如何使用列表针对实体框架类进行查询

本文关键字:查询 框架 实体 何使用 列表 | 更新日期: 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)));