2010-07-25 10 views
6

Tengo una consulta linq donde estoy creando varias clases que tienen una propiedad Parent en ellas. Estoy buscando una forma de configurar la propiedad principal para que sea la clase que acabo de crear. Mi explicación apesta; aquí está el código de lo que estoy tratando de hacer.LINQ seleccionar nueva clase con un nombre

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

¿Cómo configuro la propiedad ParentState? Si pudiera hacer algo como

select new State as newState 
{ 
    ... 
} 

eso sería genial, pero no puedo. Sé que puedo hacer esto con un ciclo foreach, pero me gustaría aprender cómo, de ser posible, hacer esto con LINQ. Ayuda :(

EDIT: He intentado sea x = {} nuevo Estado, pero eso no ayuda mucho que esperaba poder hacer referencia a x en el constructor como este, pero que no funcionó:.

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

En F #, hay algo similar a esta en la que sólo se puede decir dejar que rec x = ... y luego se puede hacer referencia a la variable en el interior de la instrucción de asignación. Pero esto es C# no F # por lo que sea.

Respuesta

0

Oye, creo que esto es lo que necesita

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

estados variables es el estado actual. Supongo que los "estados" var es un XElement y contiene los datos para poblar la propiedad parentstate

Esperanza esto ayuda

+0

Quiere que los objetos secundarios de la ciudad hagan referencia al objeto principal del estado. Su enfoque no logra este objetivo, ya que el Estado externo y el Estado padre no son el mismo objeto. –

+0

Sí, ya lo veo. Problema interesante de hecho :) – sTodorov

3

Problema interesante, y puede ciertamente ser una manera de hacerlo mediante el establecimiento de las propiedades justo en el declaración de consulta, pero creo que otra posibilidad es mover parte de esa lógica a un constructor dentro del estado. Considere el siguiente ejemplo de código

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

Esta clase de estado tiene un constructor que acepta un enumerable de objetos de ciudad. A continuación, pasa por encima de los objetos y establece la propiedad ParentState.

Y luego, en lugar de establecer las propiedades con la expresión de consulta, en su lugar se invoca el constructor.

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