2013-10-25 43 views
0

我是一个C#开发人员,我有实体框架5.实体筛选孩子不包括

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

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

现在,我想过滤所有菜单与SubMenus活动,并SubMenu与SubMenuItems活动。

为了得到这个我已经试过这样:

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(); 

但没有奏效。

有人可以帮助我吗?

谢谢你的帮助!

+0

什么'没有'工作?例外?编译器错误? – Stefan

+0

嗨, 没有例外或编译器错误。只有子菜单和子菜单不会被过滤! – Lic

回答

0

嗨你看到这篇文章吗? 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(); 

我希望这能解决你的问题

+0

嗨! 是的,我已经看到这篇文章。但这个建议: var menus = result.Select(a => a.menus).ToList(); 返回未被过滤的子菜单! – Lic

+0

这不仅仅是写这行代码。等待我写信给你和帖子中的一样,我不知道返回的数据是因为我没有那种样本数据,但是我之前类似的信息 – Raphael

+0

没问题,它可以工作。但是,我有3个匿名类型。 我会使用菜单,子菜单,子菜单类型。我已修改您的查询在新单词后添加了类型。 但我得到一个错误,因为我不能将类型的子菜单(例如)从entitycollection转换为泛型集合。 必须包装实体对象(菜单,子菜单,子菜单)? – Lic

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(); 

我希望它有帮助。

+0

这个返回子菜单对象而不是菜单对象... 我想要一个菜单​​对象列表 – Lic