2010-07-25 8 views
6

Ich habe eine Linq-Abfrage, wo ich mehrere Klassen erstellen, die eine Parent-Eigenschaft für sie haben. Ich suche nach einer Möglichkeit, die übergeordnete Eigenschaft als die Klasse zu definieren, die ich gerade erstellt habe. Meine Erklärung ist schlecht. Hier ist Code von dem, was ich versuche zu tun.LINQ wählen Sie neue Klasse mit einem Namen

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

Wie setze ich die ParentState-Eigenschaft? Wenn ich etwas tun könnte wie

select new State as newState 
{ 
    ... 
} 

das wäre cool, aber ich kann nicht. Ich weiß, dass ich dies mit einer foreach-Schleife tun kann, aber ich würde gerne lernen, wie dies möglich ist, wenn dies mit LINQ möglich ist. Hilfe :(

EDIT: Ich habe versucht, lassen x = new Staat {}, aber so viel hat nicht geholfen Ich hatte gehofft, ich x im Konstruktor wie diese verweisen könnte, aber es hat nicht funktioniert.

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

In F #, es ist etwas ähnlich wie diese, wo man einfach lassen sagen kann rec x = ... und dann können Sie die Variable in der Zuweisungsanweisung beziehen. Aber das ist C# nicht Fis so was auch immer.

Antwort

0

Hey, ich denke, das ist was du brauchst

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

der variable Zustand ist der aktuelle Zustand. Ich nehme an, die „Zustände“ var ist ein XElement und hält die Daten, die parentstate Eigenschaft

Hoffnung zu füllen, das hilft

+0

Er möchte, dass die untergeordneten Stadtobjekte auf das übergeordnete Statusobjekt verweisen. Ihr Ansatz erreicht dieses Ziel nicht, da der äußere Staat und der Elternstaat nicht dasselbe Objekt sind. –

+0

Ja, das sehe ich jetzt. Interessantes Problem in der Tat :) – sTodorov

3

Interessante Problem, und es kann sicherlich eine Möglichkeit, es zu tun, indem sie die Eigenschaften direkt in der Einstellung Abfrage-Anweisung, aber ich denke, eine andere Möglichkeit besteht darin, einen Teil dieser Logik in einen Konstruktor innerhalb von State zu verschieben. Betrachten Sie das folgende Codebeispiel

Diese State-Klasse verfügt über einen Konstruktor, der eine Auflistung von City-Objekten akzeptiert. Es führt dann eine Schleife über die Objekte und legt die ParentState-Eigenschaft fest.

Und statt die Eigenschaften mit dem Abfrageausdruck zu setzen, rufen Sie stattdessen den Konstruktor auf.

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