没有包含的实体过滤器子项

时间:2013-10-25 08:59:29

标签: c# linq filter entity parent-child

我是C#开发人员,我在使用Entity Framework 5时遇到了问题。

我使用默认代码生成策略将我的数据库映射到Entity。特别是有三类:菜单,子菜单和子菜单。 关于三个类的关系是: 一个菜单 - >很多子菜单 一个子菜单 - >许多子菜单。

所有类都有一个名为“Active”的布尔属性。

现在,我希望过滤SubMenus处于活动状态的所有菜单,以及SubMenuItems处于活动状态的SubMenus。

为了得到这个,我试过这个:

var tmp = _model.Menus.Where(m => m.Active)
                      .Select =>
                      new
                      {
                      Menu = x,
                      SubMenu = x.SubMenus.Where(sb => sb.Active)
                                          .Select(y =>
                                          new
                                          {
                                           SubMenu = y,
                                           SubMenuItem = y.SubMenuItems.Where(sbi => sbi.Active)
                                                                               })
                                          })
                      .Select(x => x.Menu).ToList();

但没效果。

有人可以帮助我吗?

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

你好,你看到这篇文章吗? Entity Framework: Querying child entities。与您的代码有一些区别,也许这会对您有所帮助。

更新:投影是指将查询结果输出到与查询结果不同的类型时,它可以是匿名类型,但也可以是具体类型。因此,使用数据传输对象可以在流程之间传递数据,您可以在此处阅读完整的解释Data Transfer objects

 public class MenuDto
{
    public int MenuId { get; set; }
    public string Name { get; set; }
    public string Url { get; set; }
    public List<MenuDto> SubMenus  { get; set; }
}
_model.Menus.Where(m => m.Active)
            .Select(p => new MenuDto
            {
                MenuId = p.idField,
                Name = p.NameField,
                Url = p.UrlField,
                SubMenus = p.SubMenus.Where(sb => sb.Active)
                    .Select(y => new MenuDto
                    {
                        MenuId = y.idField,
                        Name = y.NameField,
                        Url = y.UrlField,
                        SubMenuItem = y.SubMenuItems.Where(sbi => sbi.Active)
                          .Select(z => new MenuDto
                    {
                        MenuId = z.idField,
                        Name = z.NameField,
                        Url = z.UrlField
                    })
                    })
            }).ToList();

我希望这可以解决你的问题

答案 1 :(得分:0)

你可以试试这个:

List<SubMenuItems> tmp =  _model.menus.Where(a => a.active)
    .SelectMany(b => b.SubMenus.Where(a => a.active)).ToList()
    .SelectMany(c => c.SubMenuItems.Where(a => a.active)).ToList();

我希望它有所帮助。