问题:我正在搜索自定义Identity对象中的用户角色集合。角色有一个部门连接到他们,所以角色不仅仅是"角色"但是有一个"部门:角色"。
的模式由于角色是在一个不知道"部门"的对象中定义的。部分,构建授权列表时需要忽略此部分。 实际上,我正在寻找":角色"在每个部门内:角色"项目
我正在使用LINQ执行此操作并使其正常工作(如下所示),但我想通过删除foreach
循环来简化它,如果可能的话。我现在在网上看了几个小时,尝试了很多不同的解决方案。最接近我想要完成的两个似乎是here和here。也许答案就在那些内容中,我只是不喜欢它。
提前感谢您的帮助/建议。
我的代码:
protected static void AddObjectAuthorizationRules() {
//Code that gets current user context...
string[] pDefinedRoles = new string[] { "Developer", "Admin", "User" };
List<string> _createRoles = ProcessAuthorizationRoles(pDefinedRoles, pIdentity);
//Object authorization code that uses _createRoles...
}
private List<string> ProcessAuthorizationRoles(string[] pDefinedRoles, CustomIdentityClass pIdentity) {
List<string> _allowRoles = new List<string>();
foreach (var _role in pDefinedRoles) {
var partial = string.Format(":{0}", _role);
string[] tmp = (from r in pIdentity.Roles
where r.Contains(partial)
select r).ToArray();
foreach (string found in tmp) {
_allowRoles.Add(found);
}
}
return _allowRoles;
}
答案 0 :(得分:2)
如果你可以使用列表而不是数组,你可以尝试这样的事情。
private List<string> ProcessAuthorizationRoles(List<string> pDefinedRoles, CustomIdentityClass pIdentity)
{
return pIdentity.Roles.FindAll(x => pDefinedRoles.Exists(y => x.Contains(string.format(":{0}", y))));
}
答案 1 :(得分:1)
我想我可能会把它归结为一个单独的退货声明,但我没有引用&#34; CustomIdentityClass&#34;所以我无法为你测试。
private List<string> ProcessAuthorizationRoles(string[] pDefinedRoles, CustomIdentityClass pIdentity)
{
return (from role in (from r in pDefinedRoles
select new
{
Partial = string.Format(":{0}", r)
})
from r in pIdentity.Roles
where r.Contains(role.Partial)
select r).ToList();
}