Quando si lavora con IQuerayble<TItem>
possiamo chiamare Select
come questo:Come istanziare e inizializzare un oggetto dinamico nell'albero delle espressioni?
query.Select(item => new { A=item.Prop1, B=item.Prop2});
E Select
metodo si aspetta Expression<Func<TItem,TResult>>
ho bisogno di usare ExpandoObject
posto di classe anonima, ma staticamente tipizzato.
Se fosse possibile sarebbe assomigliare:
query.Select(item => dynamic new ExpandoBoject { A=item.Prop1, B=item.Prop2});
quindi voglio costruire albero di espressione Expression<Func<TItem,ExpandoObject>>
dove le proprietà dell'oggetto vengono inizializzati in modo simile a quello con tipo anonimo.
La funzionalità dinamica è necessaria solo per l'inizializzazione, quindi è corretto che Func restituisca ExpandoObject
anziché dynamic
.
Non riesco a trovare molta documentazione su Expression.Dynamic
e sui relativi raccoglitori che dovrei usare.
Update 1
Perchè ho bisogno di tutta questa roba?
Perché voglio get primary keys.
Voglio farlo per qualsiasi tipo di entità.
So come ottenere l'elenco delle proprietà che compongono PK, ma ora ho bisogno di fare una proiezione difficile dell'entità a EntityKey
. Bene, potrebbe essere lo stesso equivalente di questa classe.
var keys = context.Set<TEntity>().Where(Expression<Func<TEntity,bool>).Select(Expression<Func<TEntity,EntityKey>>);
Come ho osservato nelle lambda commenti contenenti blocchi non possono essere convertiti in strutture di espressione in modo che io possa non è semplice creare il dizionario e riempirlo. Ora sto giocando con l'albero di espressione semanticamente vicino a questo codice:
var dict = new Dictionary<string,object>();
dict.Add("Prop1",value1);
dict.Add("Prop2",value2);
return dict
Ma dubito EF in grado di analizzare l'espressione contenenti blocchi. Devo verificare.
E sono curioso di sapere se funzionerà con oggetti dinamici ed Expression.MemberInit come funziona con oggetti statici.
Update 2
Entity Framework non supporta la sintassi di inizializzazione dizionario.
Genera NotSupportedException
con il messaggio: Solo gli elementi di inizializzazione dell'elenco con un singolo elemento sono supportati in LINQ su Entità.
Update 3
EF non supporta le espressioni di blocco pure.
NotSupportedException
con messaggio: Espressione LINQ sconosciuta di tipo "Blocco".
Non è possibile fare qualcosa di simile a questo: 'query.Select (item => dynamic new ExpandoBoject {A = item.Prop1, B = item.Prop2});' Lippert ha detto: http: // stackoverflow. it/questions/7478048/why-cant-i-do-this-dynamic-x-new-expandoobject-foo-12-bar-twelve. – xanatos
Lo so, non posso. Era un esempio di intenzione di costruire l'albero di espressione con la dinamica. –
Ciò che si può fare è creare un tipo anonimo in LINQ e quindi, dopo che IQueryable è terminato, nella parte IEnumerable copia il tipo anonimo in un oggetto Expando. Chiaramente entrambe le espressioni possono essere autogenerate in qualche modo. – xanatos