我是EF6的新手,我想用EF编写此存储过程。我开始使用导航属性和“ .includes”,但这对我来说有点太复杂了。
对此的一些解释:我为用户分配了 RoleSetId 。 RoleSetId 链接到 ModuleGroup 。 ModuleGroup 包含 Modules ,因此用户可以基于其 RoleSetId 来访问这些 Modules 。他还可以从子 ModuleGroups 中访问 Modules 。因此, ModuleGroup 可以包含 Modules ,但也可以包含 ModuleGroups 。
这是存储过程,它基于 RoleSetId 从 ModuleGroup 获取 Id ,然后进行递归查询以获取所有<可用于 RoleSetId 的em> ModuleGroups ,然后返回所选 ModuleGroups 中包含的 Modules :
ALTER PROCEDURE [dbo].[GetModules] @RoleSetId int
AS
DECLARE @id INT
SET @id = (SELECT TOP 1 Id FROM ModuleGroup WHERE RoleSetId = @RoleSetId);
WITH groups AS (
SELECT mgg.ModuleGroupId, mgg.ModuleGroupSubGroupId
FROM [dbo].[ModuleGroupSubGroup] mgg
WHERE ModuleGroupId = @id
UNION ALL
SELECT mgg2.ModuleGroupId, mgg2.ModuleGroupSubGroupId
FROM [dbo].[ModuleGroupSubGroup] mgg2
JOIN groups g ON g.ModuleGroupSubGroupId = mgg2.ModuleGroupId
)
SELECT m.*
FROM Module m
INNER JOIN ModuleGroupModule mgm ON mgm.ModuleId = m.InternalId
WHERE mgm.ModuleGroupId IN (SELECT g.ModuleGroupSubGroupId FROM groups g) OR mgm.ModuleGroupId = @id
OPTION (MAXRECURSION 1000)
这是我的桌子(简体):
[Table("ModuleGroup")]
public class ModuleGroup : BaseModel
{
[Key]
public int Id { get; set; }
public ICollection<ModuleGroupModule> ModuleGroupModules { get; set; }
public int RoleSetId { get; set; }
}
[Table("ModuleGroupSubGroup")]
public class ModuleGroupSubGroup : BaseModel
{
[Key]
[Column(Order = 0)]
public int ModuleGroupId { get; set; }
[Key]
[Column(Order = 1)]
[ForeignKey(nameof(ModuleGroup))]
public int ModuleGroupSubGroupId { get; set; }
public ModuleGroup ModuleGroup { get; set; }
}
[Table("ModuleGroupModule")]
public class ModuleGroupModule : BaseModel
{
[Key]
[Column(Order = 0)]
[ForeignKey(nameof(ModuleGroup))]
public int ModuleGroupId { get; set; }
[Key]
[Column(Order = 1)]
[ForeignKey(nameof(Module))]
public int ModuleId { get; set; }
public Module Module { get; set; }
public ModuleGroup ModuleGroup { get; set; }
}
[Table("Module")]
public class Module : BaseModel
{
[Key]
public int Id { get; set; }
public ICollection<ModuleGroupModule> ModuleGroupModules { get; set; }
}
更清楚地说,这是数据库模式:
谢谢。