2011-10-22 13 views
10

Ho due tabelle, Table1 e Table2. Voglio eseguire, per esempio, un join esterno sinistro:Seleziona tutte le colonne dopo JOIN in 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, 
         //... 
        }; 

Come si può notare, voglio selezionare tutte le proprietà di entrambi gli oggetti dalla tabella risultante (i enumerables considerati, mentre unendo contengono gli oggetti di taluni tipi - questi sono diversi per entrambe le relazioni). Naturalmente, posso selezionare le proprietà nella selezione anonima, come mostrato nell'esempio.

La mia domanda è come evitare di specificare manualmente tutte le proprietà? Mi piacerebbe avere qualcosa come SELECT * FROM TABLE3, dove TABLE3 è una relazione risultante (dopo aver aderito TABLE1 e TABLE2).

Grazie in anticipo per gli indizi.

risposta

10

È necessario specificare ogni manualmente se si desidera proiettare in un tipo appiattito. L'altra opzione è che il tipo combinato contenga entrambi gli oggetti e che gli oggetti portino naturalmente le loro proprietà.

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

E si dovrebbe lavorare con esso come myObj.Object1.Property1, myObj.Object2.Property4, ecc

Un'opzione finale che coinvolge ancora del lavoro manuale è quello di definire un tipo appropriato e avere un costruttore o di un metodo costruttore che fa la lavoro di segmentare le proprietà dell'oggetto in un tipo appiattito. Continui a eseguire il mapping manuale, ma lo isolerai dalla logica della query.

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

la prima opzione non utilizza il metodo ToString() durante l'assegnazione? In tal caso otterrò per esempio i valori "Namespace.MyType" nella colonna Object1 dopo aver eseguito myOutput.ToArray() ... – Jamie

+0

No, non invocherà 'ToString()', cosa ti dà l'idea che sarebbe ? Lo stai legando a un controllo dell'interfaccia utente di qualche tipo? Il * control * potrebbe invocare 'ToString()', ma la query stessa è autentica, tt semplicemente usa l'intero oggetto e lo mappa su una proprietà. –

+0

il tuo commento mi ha dato un'idea: ho creato una nuova classe contenente riferimenti per entrambi gli oggetti. Quindi è facile associare a certe proprietà di questi :) – Jamie

Problemi correlati