2010-07-25 13 views
6

Mam kwerendę linq, w której tworzę kilka klas, które mają na sobie właściwość Parent. Szukam sposobu na ustawienie właściwości nadrzędnej na klasę, którą właśnie utworzyłem. Moje wytłumaczenie jest do bani; oto kod tego, co próbuję zrobić.LINQ wybierz nową klasę o nazwie

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

Jak ustawić właściwość ParentState? Gdybym mógł zrobić coś podobnego do tego, co mogłoby być fajne, ale nie mogę. Wiem, że mogę to zrobić za pomocą pętli foreach, ale chciałbym się dowiedzieć, jak to zrobić, jeśli to możliwe, z LINQ. Pomoc :(

EDIT: Próbowałem Niech X = new Stan {} ale to nie pomogło Miałem nadzieję, że odnoszę się do X w konstruktorze jak to, ale nie wyszło.

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

W języku F # istnieje coś podobnego do tego, w którym można po prostu powiedzieć niech rec x = ... , a następnie można odwołać się do zmiennej wewnątrz instrukcji przypisania, ale to jest C# nie F #, więc cokolwiek.

Odpowiedz

0

Hej, myślę, że to jest to, czego potrzebujesz

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 
} 
             } 
         }; 

stanami zmiennych jest bieżący stan. Przypuszczam, że „państwa” var jest Xelement i przechowuje dane do wypełnienia z obiektem parentstate

nadzieję, że to pomaga

+0

Chce, aby potomne obiekty miasta odwoływały się do obiektu stanu macierzystego. Twoje podejście nie spełnia tego celu, ponieważ zewnętrzne państwo i państwo nadrzędne nie są tym samym obiektem. –

+0

Tak, widzę to teraz. Interesujący problem w rzeczy samej :) – sTodorov

3

ciekawy problem, i nie może z pewnością być sposobem, aby to zrobić poprzez ustawienie właściwości prawo w zapytanie o zapytanie, ale myślę, że inną możliwością jest przeniesienie części tej logiki do konstruktora w ramach stanu. Rozważmy następujący przykład kodu:

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; 
    } 
} 

Ta klasa stanów ma konstruktor, który akceptuje przeliczalne obiekty miejskie. Następnie pętle nad obiektami i ustawia właściwość ParentState.

A następnie zamiast ustawiać właściwości za pomocą wyrażenia zapytania, zamiast tego wywołuje się konstruktora.

// 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 
        } 
       );