Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ/Lambda选择任何集合项与任何动态数组元素匹配的记录_C#_Linq_Lambda - Fatal编程技术网

C# LINQ/Lambda选择任何集合项与任何动态数组元素匹配的记录

C# LINQ/Lambda选择任何集合项与任何动态数组元素匹配的记录,c#,linq,lambda,C#,Linq,Lambda,使用MVC 5和C。前端允许按名称选择多个角色,并将它们作为CSV字符串发送给控制器。然后,控制器根据用户的角色属性筛选用户 前端通过Role.Name属性引用角色,尽管保存在用户配置文件中的角色通过Role.Id引用 例如,前端提交、客户、员工、管理员 在控制器中,我只需要选择这些角色中的用户 // Get users var filteredRecords = UserManager.Users.AsQueryable(); // Get requested roles (HTTP POS

使用MVC 5和C。前端允许按名称选择多个角色,并将它们作为CSV字符串发送给控制器。然后,控制器根据用户的角色属性筛选用户

前端通过Role.Name属性引用角色,尽管保存在用户配置文件中的角色通过Role.Id引用

例如,前端提交、客户、员工、管理员

在控制器中,我只需要选择这些角色中的用户

// Get users
var filteredRecords = UserManager.Users.AsQueryable();

// Get requested roles (HTTP POST)
string[] roleNames = model.RoleNames.Split(new string[] {","});
我可以获得一个个人角色。Id为:


我如何有效地使用LINQ/Lambda将角色名称转换为一个数组或角色列表,然后如何使用该数组/列表仅过滤这些角色中包含的用户?

我认为Contains应该可以工作

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();
}
也许是这个

var reqRoles=model.RoleNames.splitnewstring[]{,}.ToList

var findRoles=RolesManager.Roles.where=>reqRoles.Containsr.Name.selector=>r.Id.ToList

然后可以通过角色ID查找用户


从手机写入,很抱歉可能出现语法错误。

a不要使用AsQueryable。b可能重复@mjwills您的推荐人如何帮助您将Role.Name转换为Role.Id?此外,User.Roles是Role.Id的集合-您的引用不会过滤数组/List.var ids=RoleManager.Roles.where=>roleNames.Containsr.RoleName.Selectz=>z.Id.ToList上的集合。ToList会将名称转换为Id。然后我怀疑您会执行类似UserManager.Usersz=>ids.Containsz.RoleId的操作来获取具有这些角色的用户。这样行吗?你能改变多少前端?我建议首先考虑传递ID而不是姓名;而不是修改查询以使用名称。角色名称是否保证唯一?您是否确定不允许任何名称包含逗号?另外,MVC能够为您提供一个名称或ID数组,而无需生成一个逗号分隔的字符串和值,这将简化所需的逻辑。这完全忽略了问题的关键:如何有效地使用LINQ/Lambda将RoleName转换为RoleId的数组或列表,然后如何使用该数组/列表仅过滤这些角色中包含的用户?我只是认为主要思想是应用Contains。但是为了便于理解,添加了仅用于名称的输出列表。谢谢你还没回答这个问题。充其量,您回答的是如何获取具有任何给定名称的所有角色,但仍然没有回答如何检索后续用户。这不是一个答案,这是一个基本功能的坏例子,没有解释如何解决发布的问题。我认为md已经提供了他可以发送一个字符串数组到后端函数,这是上述代码的参数输入。问题是如何从输入字符串数组中获取过滤后的数据集。我怀疑这是否真的需要解释。我的建议是在LINQ中使用Contains,这样您就可以找到源数据集和输入数据集之间的精确匹配,并为输出过滤掉数据集。你是对的,我错过了roleIds数组或列表的要求
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();
}