使用 LINQ 根据字符串中的 id 获取多个字段

Get multiple fields based on ids in a string using LINQ

我有两个 Table:Table1:角色Table 和 Table2:权限Table.

角色中的示例数据Table

Name |Description           |ModulePrivIds|FunctionPrivIds|Active
=================================================================
Role1|This is a Test Role   |1,2          |3,4            |1
Role2|This is another Role  |2,3          |1,3            |0

注:ModulePrivIdFunctionPrivIds对应Ids中的Privilege Table

权限中的示例数据Table

ID | Name |Description
========================
1  |Priv1 |This is Priv1
2  |Priv2 |This is Priv2
3  |Priv3 |This is Priv3
4  |Priv4 |This is Priv4

现在我想在网格中显示所有 roles.So 的数据,而不是 ModulePrivId 和 FunctionPrivId,我想使用 Privilege Table.

显示权限名称

这是我正在尝试但无法达到预期结果的方法。

var answer = (from r in database.RolesRepository.Get()
            join p in database.PrivilegesRepository.Get()
            on r.ModulePrivilegeIds equals p.Id.ToString() into ModuleWisePrivileges
            from p1 in ModuleWisePrivileges.DefaultIfEmpty()

            from r1 in database.RolesRepository.Get()
            join p01 in database.PrivilegesRepository.Get()
            on r1.FunctionPrivilegeIds equals p01.Id.ToString() into FunctionWisePrivileges
            from p2 in FunctionWisePrivileges.DefaultIfEmpty()

            select new
            {
                Name = r.Name,
                Description = r.Description,
                ModuleWisePrivileges = ModuleWisePrivileges,
                FunctionWisePrivileges = FunctionWisePrivileges,
                Active = r.Active

            }).ToArray();

return answer;

我也尝试了以下但没有成功。

var answer = (from r in database.RolesRepository.Get()
            join p in database.PrivilegesRepository.Get()
            on p.Id.ToList().Where(p => Id.Contains(r.ModulePrivilegeIds.ToString()) into ModuleWisePrivileges)
            from p1 in ModuleWisePrivileges.DefaultIfEmpty()

            from r1 in database.RolesRepository.Get()
            join p01 in database.PrivilegesRepository.Get()
            on r1.FunctionPrivilegeIds equals p01.Id.ToString() into FunctionWisePrivileges
            from p2 in FunctionWisePrivileges.DefaultIfEmpty()

            select new
            {
                Name = r.Name,
                Description = r.Description,
                ModuleWisePrivileges = ModuleWisePrivileges,
                FunctionWisePrivileges = FunctionWisePrivileges,
                Active = r.Active

            }).ToArray();

如果您无法修复数据库,您将面临一个多步骤过程:

  1. Select 来自 RolesTable
  2. 的行
  3. 拆分 ID 字段
  4. Select 来自数据库的权限

像这样:

var roles = database.RolesRepository.Get().ToArray();
var answers = roles.Select(r => new {
                Name = r.Name,
                Description = r.Description,
                ModuleWisePrivileges = r.ModulePrivilegeIds.Split(',')
                                        .Select(x => database.PrivilegesRepository.Get(x))
                                        .ToArray(),
                FunctionWisePrivileges = r.FunctionPrivilegeIds.Split(',')
                                          .Select(x => database.PrivilegesRepository
                                                               .Get(x))
                                          .ToArray(),
                Active = r.Active
            }

如果您的存储库允许您基于 ID 列表一次获取多个项目,则可以提高性能。
如果权限列表比较少,最好先全部存入内存:

var roles = database.RolesRepository.Get().ToArray();
var privileges = database.PrivilegesRepository.Get().ToDictionary(x => x.Id, x => x);
var answers = roles.Select(r => new {
                Name = r.Name,
                Description = r.Description,
                ModuleWisePrivileges = r.ModulePrivilegeIds.Split(',')
                                        .Select(x => privileges[x])
                                        .ToArray(),
                FunctionWisePrivileges = r.FunctionPrivilegeIds.Split(',')
                                          .Select(x => privileges[x])
                                          .ToArray(),
                Active = r.Active
            }

检查一次,用逗号分隔值更新上面的代码

var roles = database.RolesRepository.Get().ToArray();
var answers = roles.Select(r => new {
            Name = r.Name,
            Description = r.Description,
            ModuleWisePrivileges = string.Join(", ", (r.ModulePrivilegeIds.Split(',')
                                    .Select(x => database.PrivilegesRepository.Get(x).FirstOrDefault())
                                    .ToArray()),
            FunctionWisePrivileges = string.Join(", ", (r.FunctionPrivilegeIds.Split(',')
                                      .Select(x => database.PrivilegesRepository.Get(x).FirstOrDefault())
                                      .ToArray()),
            Active = r.Active
        }

已根据您的评论更新查询

 var roles = database.RolesRepository.Get().ToArray();
 var answers = roles.Where(a => a.isDeleted == false).Select(r => new {
        Name = r.Name,
        Description = r.Description,
        ModuleWisePrivileges = string.Join(", ", (r.ModulePrivilegeIds.Split(',')
                                .Select(x => database.PrivilegesRepository.Get(x).FirstOrDefault())
                                .ToArray()),
        FunctionWisePrivileges = string.Join(", ", (r.FunctionPrivilegeIds.Split(',')
                                  .Select(x => database.PrivilegesRepository.Get(x).FirstOrDefault())
                                  .ToArray()),
        Active = r.Active
    }