2010-06-24 9 views
7

È possibile proiettare tutte le proprietà di un oggetto e aggiungerne altre, senza specificarle tutte. Per esempio, invece di fare questo:Proiezione di oggetti completi con valori aggiuntivi in ​​LINQ

var projection = from e in context.entities 
        select new QuestionnaireVersionExtended 
        { 
         Id = e.Id, 
         Version = e.Version, 
         CreationDate = e.CreationDate, 
         ... 
         many more properties 
         ... 
         NumberOfItems = (e.Children.Count()) 
        }; 

possiamo fare qualcosa di simile:

var projection = from e in context.entities 
        select new QuestionnaireVersionExtended 
        { 
         e, 
         NumberOfItems = (e.Children.Count()) 
        }; 

Dove ci vorrà ogni proprietà da e con lo stesso nome, e aggiungere la proprietà "NumberOfItems" su quella?

+0

Sarebbe bello ... tuttavia, scriverei qualcosa come 'e. *' Piuttosto che solo 'e'. Sarebbe particolarmente utile per i tipi anonimi –

risposta

3

No, questo non è possibile. La clausola select di un'espressione LINQ consente le normali espressioni C# che producono un valore. Non esiste un costrutto C# che crei un oggetto tramite un inizializzatore di oggetti in uno stile modello come questo. Avrai bisogno di elencare le proprietà o utilizzare un costruttore esplicito.

+0

@Reed, perso quello. Aggiornerà la mia risposta – JaredPar

1

Se si aggiunge un costruttore per QuestionnaireVersionExtended che toglie il soggetto più NumberOfItems, è possibile utilizzare il costruttore direttamente:

var projection = from e in context.entities 
    select new QuestionnaireVersionExtended(e, NumberOfItems = (e.Children.Count())); 

V'è, tuttavia, non c'è modo di dire al compilatore "basta copiare tutte le proprietà attraverso esplicitamente. "

+0

Come ha osservato Jarod, elencare le proprietà è ciò che sto cercando di evitare, perché ce ne sono molte. – CodeGrue

1

Ci sono diversi modi in cui è possibile ottenere questo risultato, ma saranno tutti incubi.

1.) Sovraccarico un costruttore e copiare tutti i valori di là (tuttavia, che è quello che si sta cercando di allontanarsi da.

2.) Utilizzare riflessione per copiare le proprietà sopra (molti effetti collaterali male, non consigliato)

3.) UTILIZZARE IL MODELLO DEL DECORATORE. Sembra che tu abbia aggiunto dei valori alla classe originale, quindi penso che questo sarebbe il momento perfetto per usare un decoratore. Ciò farebbe sì che, man mano che le proprietà vengono aggiunte, non vengano perse. Romperebbe la compilazione, tuttavia questa soluzione non è perfetta se l'oggetto da decorare è sealed.

Problemi correlati