在下图中,我展示了表格的外观。在过去的几个小时里,我正在尝试为我需要的查询提供最佳解决方案但不知何故我在EF的圈子中运行
我需要一系列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 *
答案 0 :(得分: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)
};
答案 1 :(得分:0)
不是从Role开始,而是从连接表开始,如果在该类中有导航属性,则可以包含它们。
_context.RoleModule()
.Include("Role")
.Include("Module")
.Select(rm=> new {Role = rm.Role, Module = rm.Module}).ToList();