J'ai essayé de simplifier cet exemple, car le code dans lequel je joue est plus complexe. Donc, alors que cet exemple peut sembler stupide, supporter avec moi. Disons que je travaille avec la base de données AdventureWorks et je décide que je veux ajouter une propriété appelée Blarg
à la table Product
qui retourne une expression qui contient le code que je voudrais utiliser en plusieurs endroits:Récupération d'une expression à partir d'une propriété et ajout à une arborescence d'expressions
public partial class Product
{
public Expression<Func<Product, string>> Blarg
{
get { return product => product.ProductModelID.HasValue ? "Blarg?" : "Blarg!"; }
}
}
Ce que je vouloir faire est de créer un arbre d'expression d'expression, l'obtenir l'expression de Product.Blarg, et le groupe par le résultat. Quelque chose comme ceci:
var productParameter = Expression.Parameter(typeof(Product), "product");
// The Problem
var groupExpression = Expression.Lambda<Func<Product, string>>(
Expression.Invoke(
Expression.Property(productParameter, "Blarg"),
productParameter),
productParameter);
using (AdventureWorksDataContext db = new AdventureWorksDataContext())
{
var result = db.Products.GroupBy(groupExpression).ToList();
// Throws ArgumentException: "The argument 'value' was the wrong type.
// Expected 'System.Delegate'.
// Actual 'System.Linq.Expressions.Expression`1[System.Func`2[LINQ_Test.Product,System.String]]'."
}
Il est évident que groupExpression
est incorrect (voir le commentaire de code pour l'exception), mais je ne sais pas comment je devrais faire cela. Ce que je pensais que je disais est "obtenir l'expression à partir du product.Blarg
, l'exécuter, et retourner le résultat de la chaîne." Je suppose que ce n'est pas ce que je dis réellement là, cependant. J'essaie toujours de comprendre les arbres d'expression. Une idée de comment je pourrais retirer ça?
Quelque chose semble louche avec cet exemple de code (sauf si LambdaExpression a un mécanisme de distribution drôle). – leppie
Ca marche, chou! Je ne pensais pas :) – leppie
@marc: quelle est la raison pour laquelle vous allez ce long chemin, quand ma solution ci-dessus est suffisante? – leppie