如何在EF中解决此连接问题

时间:2013-06-07 14:02:59

标签: c# database entity-framework join

在下图中,我展示了表格的外观。在过去的几个小时里,我正在尝试为我需要的查询提供最佳解决方案但不知何故我在EF的圈子中运行

enter image description here

我需要一系列Roles及其模块。由于存在没有分配模块的角色,因此它应该是左连接。集合应该看起来像“{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); } }
}

工作正常。我的另一个问题是,......我如何制作“设置”访问器。

被修改

现在有了这个并且它有效。但是如何访问模块集合。

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 *

2 个答案:

答案 0 :(得分:3)

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

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

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

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

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

var query = from r in context.Roles
            select new {
                 Role = r,
                 Modules = r.RoleModules.Select(rm => rm.Module)
            };

答案 1 :(得分:0)

不是从Role开始,而是从连接表开始,如果在该类中有导航属性,则可以包含它们。

_context.RoleModule()
.Include("Role")
.Include("Module")
.Select(rm=> new {Role = rm.Role, Module = rm.Module}).ToList();