2012-10-04 58 views
0

我有下面的模型,它代表一個兩級菜單層次結構,我需要做的是從SubMenuItems子集合中選擇一個ID,然後連接來自其父記錄的結果TextToDisplay屬性。LINQ選擇並連接分層模型的結果

我的問題是如何返回一個父項,然後單個子項訪問TextToDisplay財產?

,我要查詢的對象是ObserableCollection

public ObservableCollection<MenuModel> MenuItems { get; set; } 

型號

public class MenuModel 
{ 
    public int ID { get; set; } 
    public string TextToDisplay { get; set; } 
    public string ImageSource { get; set; } 
    public ObservableCollection<MenuModel> SubMenuItems { get; set; } 
} 

回答

1

使用Single()拿到一個項目,Any()檢查,如果有一個列表的元素它匹配的查詢:

int theIdYouWant = 30; //for example 
var parentItem = MenuItems.Single(i => i.SubMenuItems.Any(si => si.Id == theIdYouWant)); 
var text = parentItem.TextToDisplay + 
    parentItem.SubMenuItems.Single(i => i.Id == theIdYouWant).TextToDisplay; 

注意如果沒有父項目包含在30號子項,這將拋出一個異常,或如果返回不止一個父項目 - 所以你可能需要使用SingleOrDefault()而不是和檢查空,或Where然後選擇你想要什麼物品。

+0

我會使用'單()'要小心,因爲它沒有給對象的異常發現。我建議使用'SingleOrDefault()'來代替。 –

+0

@PatrikW是的,我其實剛剛添加了一句話來解釋這件事。 –

+0

(i =>查詢)中的查詢代表什麼? –