2013-03-21 12 views
12

Attualmente in LINQ, i seguenti compila e funziona bene:Utilizzando LINQ, è possibile generare un oggetto dinamico da un'istruzione Select? Se é cosi, come?

var listOfFoo = myData.Select(x => new FooModel{ 
    someProperty = x.prop1, 
    someOtherProperty = x.prop2 
}); 

public class FooModel{ 
    public string someProperty { get; set; }; 
    public string someOtherProperty { get; set; }; 
} 

Tuttavia, negli ultimi versioni di .NET/C# hanno ampliato il ruolo di oggetti dinamici come il ExpandoObject e mi chiedo se non v'è un modo per fare fondamentalmente questo:

var listOfFoo = myData.Select(x => new ExpandoObject{ 
    someProperty = x.prop1, 
    someOtherProperty = x.prop2 
}); 

Ovviamente, ho già provato il codice di cui sopra, senza successo, ma sembra che mi manca qualcosa.

risposta

25

Si dovrebbe essere in grado di creare un nuovo oggetto anonimo senza alcun tipo dichiarato:

var listOfFoo = myData.Select(x => new { 
    someProperty = x.prop1, 
    someOtherProperty = x.prop2 
}); 
+0

D'oh! Uomo mi sento stupido. Sì, è stato facile. Può accettare la risposta in 6 minuti. Grazie! –

+4

@MatthewPatrickCashatt Si noti che non c'è nulla di dinamico nell'oggetto. L'oggetto qui definito è staticamente digitato e anche immutabile. Ora, se questo è adatto alle tue esigenze, è grandioso, ma se davvero volevi ciò che hai chiesto nella domanda, allora non è così. – Servy

+0

Grazie, @Servy. Apprezzo anche la tua risposta. Ciò che mi confonde in merito al tuo commento, tuttavia, è che l'approccio di @ d_r_w continua a consentirmi di aggiungere proprietà dinamiche all'oggetto. Ad esempio, 'foreach (elemento dinamico in listOfFoo {item.someNewProperty =" bar "}' funziona bene. Cosa mi manca? –

10

Non c'è nulla per impedire l'utilizzo Select per restituire un insieme di ExpandoObject di, semplicemente non sono costruendo correttamente il ExpandoObject . Ecco un modo:

var listOfFoo = myData.Select(x => 
    { 
     dynamic expando = new ExpandoObject(); 
     expando.someProperty = x.prop1; 
     expando.someOtherProperty = x.prop2; 
     return (ExpandoObject)expando; 
    }); 
+2

Non penso che funzionerà senza convertire in un oggetto IEnumerable –

+0

@MystereMan Conversione di un elemento "IEnumerable"? – Servy

+0

Conversione di EF IQueryable (presumo che non sia Linq per oggetti). Non penso che il codice ExpandoObject sarà convertibile in SQL, quindi probabilmente genererebbe un errore EF. Dovresti convertire i risultati in IEnumerable per farlo. –

Problemi correlati