J'ai une méthode qui prend actuellement un Func<Product, string>
comme paramètre, mais j'en ai besoin pour être un Expression<Func<Product, string>>
. En utilisant AdventureWorks, voici un exemple de ce que je voudrais faire en utilisant le Func.Refactoring Func <T> en Expression <Func<T>>
private static void DoSomethingWithFunc(Func<Product, string> myFunc)
{
using (AdventureWorksDataContext db = new AdventureWorksDataContext())
{
var result = db.Products.GroupBy(product => new
{
SubCategoryName = myFunc(product),
ProductNumber = product.ProductNumber
});
}
}
Je voudrais qu'il ressemble à quelque chose comme ceci:
private static void DoSomethingWithExpression(Expression<Func<Product, string>> myExpression)
{
using (AdventureWorksDataContext db = new AdventureWorksDataContext())
{
var result = db.Products.GroupBy(product => new
{
SubCategoryName = myExpression(product),
ProductNumber = product.ProductNumber
});
}
}
Cependant, le problème que je suis en cours d'exécution en est que myExpression(product)
est invalide (ne compilera pas). Après avoir lu quelques autres messages, je comprends pourquoi. Et si ce n'était pas le fait que j'ai besoin pour la variable product
la deuxième partie de ma clé, je pourrais probablement dire quelque chose comme ceci:
var result = db.Products.GroupBy(myExpression);
Mais je besoin la variable product
parce que je besoin du deuxième partie de la clé (ProductNumber). Donc je ne suis pas vraiment sûr de ce qu'il faut faire maintenant. Je ne peux pas le laisser comme un Func parce que cela cause des problèmes. Je ne peux pas comprendre comment utiliser une expression parce que je ne vois pas comment je pourrais passer la variable product
. Des idées?
EDIT: Voici un exemple de la façon dont je qualifierais la méthode:
DoSomethingWithFunc(product => product.ProductSubcategory.Name);
Nice! La dernière ligne ne compile pas pour moi, cependant, où le résultat est assigné. "Les arguments de type pour la méthode ... ne peuvent pas être déduits de l'utilisation." Est-ce que je manque quelque chose? – Ecyrb
La valeur renvoyée par 'Expression.Lambda' doit être convertie en' Expression> '. –
Excellent! Cela s'est avéré plus complexe que ce à quoi je m'attendais. Je n'ai jamais fait ma propre Expression comme ça auparavant, donc j'étudierai ce code pour être sûr de bien comprendre ce qui se passe. Merci! – Ecyrb