使用 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
注:ModulePrivId和FunctionPrivIds对应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();
如果您无法修复数据库,您将面临一个多步骤过程:
- Select 来自
RolesTable
的行
- 拆分 ID 字段
- 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
}
我有两个 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
注:ModulePrivId和FunctionPrivIds对应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();
如果您无法修复数据库,您将面临一个多步骤过程:
- Select 来自
RolesTable
的行
- 拆分 ID 字段
- 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
}