使用MVC 5和C#。前端允许按名称选择多个角色,并将它们作为CSV字符串发送到控制器。然后,控制器将按用户的“角色”属性过滤用户。
尽管Role.Name
引用了用户个人资料中保存的角色,但是前端通过Role.Id
属性引用了角色。
例如,前端提交"Customer,Employee,Administrator"
在控制器中,我只需要选择具有这些角色的那些用户。
// Get users
var filteredRecords = UserManager.Users.AsQueryable();
// Get requested roles (HTTP POST)
string[] roleNames = model.RoleNames.Split(new string[] {","});
我可以通过以下方式获得一个单独的Role.Id
:
RoleManager.Roles.FirstOrDefault(r => r.Name == roleName).Id
如何才能有效地使用LINQ / Lambda将roleNames
转换为roleIds
的数组或列表,然后如何使用该数组/列表仅过滤那些角色中包含的用户?
答案 0 :(得分:-1)
也许是这个
var reqRoles = model.RoleNames.Split(new string [] {“,”})。ToList();
var findRoles = RolesManager.Roles.Where(r => reqRoles.Contains(r.Name))。Select(r => r.Id).ToList();
然后您可以通过角色ID查找用户。
通过手机撰写,很抱歉可能出现语法错误。
答案 1 :(得分:-2)
我认为包含应该起作用。
string[] input = new string[] { "A", "B", "C" };
string[] dataset = new string[] { "A", "B", "C", "D", "E" };
List<string> output = dataset.Where(x => input.Contains(x)).ToList();
只要您可能遇到基于对象的数据集,概念都是一样的,您可以尝试
public class SimpleSet
{
public string name { get; set; }
public int id { get; set; }
public SimpleSet(int id, string name)
{
this.id = id;
this.name = name;
}
}
public void Execute()
{
string[] input = new string[] { "A", "B", "C" };
//string[] dataset = new string[] { "A", "B", "C", "D", "E" };
List<SimpleSet> dataset = new List<SimpleSet>();
dataset.Add(new SimpleSet(1, "A"));
dataset.Add(new SimpleSet(2, "B"));
dataset.Add(new SimpleSet(3, "C"));
dataset.Add(new SimpleSet(4, "D"));
dataset.Add(new SimpleSet(5, "E"));
List<SimpleSet> output = dataset.Where(x => input.Contains(x.name)).ToList();
List<string> output_namesOnly = dataset.Where(x => input.Contains(x.name)).Select(x => x.name).ToList();
List<int> output_idsOnly = dataset.Where(x => input.Contains(x.name)).Select(x => x.id).ToList();
}