J'ai demandé un very similar question hier, mais ce n'est qu'aujourd'hui que j'ai réalisé que la réponse que j'ai acceptée ne résout pas tous mes problèmes. J'ai le code suivant:Comment puis-je créer une multi-propriété dynamique Sélectionnez sur un IEnumerable <T> lors de l'exécution?
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 });
}
qui est utilisé comme suit:
string primaryKey = _map.GetPrimaryKeys(typeof(TOriginator)).Single();
var primaryKeyExpression = SelectExpression<TOriginator>(primaryKey);
var primaryKeyResults = query.Select(primaryKeyExpression).ToList();
Cela me permet de retirer les clés primaires d'un IQueryable<TUnknown>
. Le problème est que ce code ne fonctionne qu'avec une seule clé primaire et j'ai besoin d'ajouter le support pour plusieurs PK.
Donc, est-il possible d'adapter la méthode SelectExpression
ci-dessus pour prendre un IEnumerable<string>
(qui est ma liste de noms de propriétés de clé primaire) et la méthode retourne-t-elle une expression qui sélectionne ces clés?
I.e. Compte tenu de ce qui suit:
var knownRuntimePrimaryKeys = new string[] { "CustomerId", "OrderId" }`
My Select doit effectuer les opérations suivantes (à l'exécution):
var primaryKeys = query.Select(x=> new { x.CustomerId, x.OrderId });
Le problème est que les types anonymes qui sont les résultats de la sélection statemet sont créés au moment de la compilation .. – m0sa
Y at-il une alternative à l'utilisation d'un type anonyme et encore réaliser ce dont j'ai besoin? Ou est-ce de nouveau à la planche à dessin? – GenericTypeTea
@GenericTypeTea, un Tuple serait-il une option acceptable pour vous? –