2011-10-22 24 views
10

Tengo dos tablas, Table1 y Table2. Quiero llevar a cabo, por ejemplo, una combinación externa izquierda:Seleccione todas las columnas después de UNIR en LINQ

var myOutput = from object1 in Table1 
       join object2 in Table2 
       on object1.Property1 equals object2.Property2 into Table3 
       from output in Table3.DefaultIfEmpty() 
       select new 
        { 
         object1.Property1, 
         object1.Property2, 
         //... 
         output.Property3, 
         output.Property4, 
         //... 
        }; 

Como se puede notar, que desea seleccionar todas las propiedades de los objetos de la tabla resultante (los enumerables considerar al unirse contienen los objetos de ciertos tipos - estos son diferentes para ambas relaciones). Por supuesto, puedo seleccionar las propiedades en la selección anónima, como se muestra en el ejemplo.

Mi pregunta es cómo evitar especificar todas las propiedades de forma manual? Me gustaría tener algo como SELECT * FROM TABLE3, donde TABLE3 es una relación resultante (después de unir TABLE1 y).

Gracias de antemano por las pistas.

Respuesta

10

Debe especificar cada uno manualmente si desea proyectar en un tipo aplanado. Su otra opción es que su tipo combinado contenga ambos objetos, y los objetos traerán naturalmente sus propiedades.

select new 
{ 
    Object1 = object1, 
    Object2 = output 
}; 

y que sería trabajar con él como myObj.Object1.Property1, myObj.Object2.Property4, etc.

Una opción final que todavía implica un trabajo manual es definir un tipo apropiado y tener un constructor o un método constructor que hace el trabajo de segmentación de las propiedades de objeto en un tipo aplanado. Aún realiza la asignación manual, pero la aísla de su lógica de consulta.

select new CombinedType(object1, output); 
//or 
select builder.GetCombinedType(object1, output); 
+0

¿no es la primera opción usar el método ToString() durante la asignación? En ese caso obtendré, por ejemplo, valores de "Namespace.MyType" en la columna llamada Object1 después de hacer myOutput.ToArray() ... – Jamie

+0

No, no invocará 'ToString()', lo que le da la idea de que lo haría ? ¿Lo estás vinculando a un control de IU de algún tipo? El * control * podría invocar 'ToString()', pero la consulta misma es auténtica, tt simplemente usa el objeto completo y lo mapea a una propiedad. –

+0

su comentario me dio una idea: he creado una nueva clase que contiene referencias para ambos objetos. Entonces es fácil vincularse a ciertas propiedades de estos :) – Jamie

Cuestiones relacionadas