2013-10-25 93 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