2010-07-25 103 views
6

我有一個linq查詢,我在其中創建了幾個父類屬性的類。我正在尋找一種方法將父級屬性設置爲我剛剛創建的類。我的解釋很糟糕;這是我想要做的事情的代碼。LINQ選擇一個名稱的新類

var query = from states in xml.Elements() 
        select new State 
        { 
         Children = from cities in states.Elements() 
            select new City() 
            { 
             ParentState = **???**; 
            } 
        }; 

如何設置ParentState屬性?如果我可以做點像

select new State as newState 
{ 
    ... 
} 

那會很酷,但我做不到。我知道我可以用foreach循環來做到這一點,但我想了解如果可能的話,如何用LINQ來做到這一點。說明:(

編輯:我試過 令x =新的國家{}但這並沒有太大的幫助,我希望我可以指X在這樣的構造,但沒有成功。

let x = new State 
{ 
    Children = from cities in states.Elements() 
       select new City{ ParentState = x } 
} 
select x; 

在F#中,有一些類似的地方,你可以簡單地說讓拍攝X = ... 然後你可以參考變量賦值語句的內部。但是,這是C#不是F#的所以無論如何。

回答

0

嘿,我認爲這是你需要的東西

var query = from states in xml.Elements() 
         select new State 
         { 
          Children = from cities in states.Elements() 
             select new City() 
             { 
              ParentState = new State{ 
               Property1 = states.XElement("Property1").Value 
} 
             } 
         }; 

變量狀態是當前狀態。我相信了「狀態」變種是一個的XElement並保持數據來填充parentstate財產

希望這有助於

+0

他希望子城市對象引用父狀態對象。你的方法沒有達到這個目標,因爲外部國家和父母國家不是同一個對象。 – 2010-07-25 21:40:21

+0

是的,我現在看到了。有趣的問題確實:) – sTodorov 2010-07-25 21:51:24

3

有趣的問題,並有一定可能的方式在右邊的設置屬性做查詢語句,但我認爲另一種可能性是將某些邏輯移至State內的構造函數。考慮下面的代碼示例

class State 
{ 
    public int Id { get; set; } 
    public List<City> Children { get; set; } 

    public State(int id, IEnumerable<City> childrenCities) 
    { 
     this.Id = id; 
     this.Children = childrenCities.ToList(); 
     foreach (City city in this.Children) 
      city.ParentState = this; 
    } 
} 

這個State類有一個接受City對象的枚舉的構造函數。然後它遍歷對象並設置ParentState屬性。

然後,而不是使用查詢表達式設置屬性,而是調用構造函數。

// not LINQ-to-XML, just an example 
var states = from i in Enumerable.Range(0, 10) 
       select new State(
        i, 
        from j in Enumerable.Range(0, 5) 
        select new City 
        { 
         Id = j 
        } 
       );