Ho chiesto un very similar question ieri, ma non è stato fino a oggi ho capito che la risposta che ho accettato non risolve tutti i miei problemi. Ho il seguente codice:Come posso creare una proprietà multi-selezione dinamica su un oggetto IEnumerable <T> in fase di runtime?
public Expression<Func<TItem, object>> SelectExpression<TItem>(string fieldName)
{
var param = Expression.Parameter(typeof(TItem), "item");
var field = Expression.Property(param, fieldName);
return Expression.Lambda<Func<TItem, object>>(field,
new ParameterExpression[] { param });
}
che viene utilizzato come segue:
string primaryKey = _map.GetPrimaryKeys(typeof(TOriginator)).Single();
var primaryKeyExpression = SelectExpression<TOriginator>(primaryKey);
var primaryKeyResults = query.Select(primaryKeyExpression).ToList();
Questo mi permette di tirare fuori le chiavi primarie da un IQueryable<TUnknown>
. Il problema è che questo codice funziona solo con una singola chiave primaria e ho bisogno di aggiungere il supporto per più PK.
Quindi, c'è un modo per adattare il metodo SelectExpression
in precedenza per prendere un IEnumerable<string>
(che è il mio elenco di nomi di proprietà di chiave primaria) e il metodo restituire un'espressione che seleziona quelle chiavi?
I.e. Dato il seguente:
var knownRuntimePrimaryKeys = new string[] { "CustomerId", "OrderId" }`
mio Select ha bisogno di fare quanto segue (in fase di esecuzione):
var primaryKeys = query.Select(x=> new { x.CustomerId, x.OrderId });
Il problema è che i tipi anonimi che sono i risultati del select statemet sono creati al momento della compilazione .. – m0sa
Esiste un'alternativa all'utilizzo di un tipo anonimo e ancora ottenere quello che ho bisogno? O è tornato al tavolo da disegno? – GenericTypeTea
@GenericTypeTea, una tupla sarebbe un'opzione accettabile per te? –