LINQ / Lambda以选择具有与任何动态数组元素匹配的任何Collection项目的记录

时间:2018-07-23 05:43:45

标签: c# linq lambda

使用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的数组或列表,然后如何使用该数组/列表仅过滤那些角色中包含的用户?

2 个答案:

答案 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();
}