0

在下图中,我展示了我的桌子的外观。在过去的几个小时里,我试图为我需要的查询获得最佳解决方案,但不知何故我在 EF 的圈子里跑

在此处输入图像描述

我需要一组角色及其模块。由于有些角色没有分配模块,因此应该是左连接。集合应该看起来像“{role, modules}”角色应该是单个对象,模块应该是“模块”对象的集合。

我试着这样做

var x = (from r in _context.Role
                     from rm in r.RoleModule.DefaultIfEmpty()
                     join m in _context.Module on rm.ModuleID equals m.ID
                     select new { role= r, modules=rm }).ToList();

编辑

根据lazyberezovsky的建议,我做了部分课程

public partial class Role
{
    public virtual IEnumerable<Module> Modules { get { return RoleModule.Select(p => p.Module); } }
}

工作正常。我的另一个问题是,....我怎样才能制作“set”访问器。

已编辑

现在得到这个,它的工作原理。但是我怎样才能访问模块的集合。

var x = (from r in _context.Role
                     join rm in _context.RoleModule on r.ID equals rm.RoleID into ps
                     from rm in ps.DefaultIfEmpty()
                     select new { role=r, modules=rm.Module }).GroupBy(p => p.role).ToList();

* 在 wpf 中使用它来设置为 datacontext*

4

2 回答 2

3

Role最简单的解决方案是为实体中的模块定义导航属性:

public class Role
{
   // ...
   public virtual ICollection<Module> Modules { get; set; }
}

然后,您将能够使用模块进行角色的急切加载:

var roles = _context.Role.Include(r => r.Modules).ToList();

如果您的联结表很复杂,则创建ICollection<RoleModule>同时包含Role和的类型的导航属性Module。查询将如下所示:

var query = from r in context.Roles
            select new {
                 Role = r,
                 Modules = r.RoleModules.Select(rm => rm.Module)
            };
于 2013-06-07T14:05:23.793 回答
0

与其从角色开始,不如从连接表开始,如果您在该类中有导航属性,则可以包含它们。

_context.RoleModule()
.Include("Role")
.Include("Module")
.Select(rm=> new {Role = rm.Role, Module = rm.Module}).ToList();
于 2013-06-07T14:42:59.440 回答