2009-02-25 25 views
11

¿Hay alguna manera de agregar una propiedad a los objetos de un resultado de consulta de Linq que no sea el siguiente?LINQ - Agregar propiedad a los resultados

var query = from x in db.Courses 
       select new 
       { 
        x.OldProperty1, 
        x.OldProperty2, 
        x.OldProperty3, 
        NewProperty = true 
       }; 

Quiero hacer esto sin enumerar todas las propiedades actuales de mi objeto. Hay muchas propiedades, y no quiero tener que actualizar este código cada vez que pueda cambiar mi clase.

Todavía estoy aprendiendo con LINQ y agradezco sus sugerencias.

+0

Esta es una pregunta estúpida. Lo sé mejor ahora. Las bibliotecas de mapeo automático son solo errores que están por ocurrir. No seas perezoso Escribir el código de mapeo –

Respuesta

7

Añadir con clases parciales:

public partial class Courses 
{ 
    public String NewProperty { get; set; } 
} 

A continuación, puede asignarlo después de haber creado el objeto.

+0

Eso es tiempo de compilación. ¿No es la pregunta el tiempo de ejecución, por lo que esta no es una respuesta válida a la pregunta? – peSHIr

+0

no esta es una buena respuesta. –

+4

Por supuesto, si va a alterar el diseño de la clase original (para que sea parcial), también puede continuar y agregar la propiedad ... –

6

supongo que se podría devolver un nuevo objeto compuesto de la nueva propiedad y el objeto seleccionado, como:

var query = from x in db.Courses 
       select new 
       { 
        Course x, 
        NewProperty = true 
       }; 
+2

Realmente estaba buscando una forma de "inyectar" la propiedad en mi objeto actual. ¡Pero gracias! –

4

de ganarse la respuesta será el método más sencillo.

Si eso no funciona para usted (porque necesita pasar los resultados o lo que sea), y suponiendo que la clase que está tratando ya define la propiedad que desea establecer, puede crear un constructor de copia o método de fábrica que tiene una instancia existente más el valor de la propiedad que desea establecer:

var query = from x in db.Courses 
      select new Course(x, valueOfNewProperty); 

Alternativamente, si Courseno definir la propiedad, usted podría subclase y utilizar el mismo enfoque:

var query = from x in db.Courses 
      select new CourseWithExtraProperty(x, valueOfNewProperty); 

(obviamente, elija un nombre mejor para su subclase)

De nuevo, sin embargo, a menos que realmente necesite hacer esto, quédese con la solución de eking.

1
  • ServiceStack tiene una built-in way de manejar esto con el método PopulateWith.

    • Aquí hay un code example.

      foreach (var item in results) 
      { 
          var test1 = new ItemDto().PopulateWith(item); 
          test1.extraField1 = "extra"; 
          response.Add(test1); 
      }` 
      
  • Y si no se está usando ServiceStack, siempre se puede utilizar AutoMapper.

    CreateMap<Foo, Bar>().ForMember(x => x.ExtraBarProperty, opt => opt.Ignore());

Cuestiones relacionadas