У меня есть метод, который в настоящее время принимает параметр Func<Product, string>
, но мне нужно, чтобы он был Expression<Func<Product, string>>
. Используя AdventureWorks, вот пример того, что я хотел бы сделать, используя Func.Рефакторинг Func <T> в выражение <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
});
}
}
Я хотел бы, чтобы это выглядело примерно так:
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
});
}
}
Однако проблема я бегу в том, что myExpression(product)
является недействительным (не компилировать). После прочтения некоторых других сообщений я понимаю, почему. И если бы это был не тот факт, что мне нужно переменную product
для второй части моего ключа я мог бы сказать что-то вроде этого:
var result = db.Products.GroupBy(myExpression);
Но мне нужна переменная product
, потому что мне нужно второе часть ключа (ProductNumber). Поэтому я не совсем уверен, что делать сейчас. Я не могу оставить его как Func, потому что это вызывает проблемы. Я не могу понять, как использовать выражение, потому что не вижу, как я могу передать ему переменную product
. Есть идеи?
EDIT: Вот пример того, как я назвал бы метод:
DoSomethingWithFunc(product => product.ProductSubcategory.Name);
Ницца! Последняя строка не компилируется для меня, хотя, где назначается результат. «Аргументы типа для метода ... не могут быть выведены из использования». Я что-то упускаю? – Ecyrb
Возвращаемое значение из 'Expression.Lambda' должно быть выбрано в выражение>'. –
Отлично! Это оказалось более сложным, чем я ожидал. Я никогда раньше не делал свое собственное выражение таким образом, поэтому я изучу этот код, чтобы убедиться, что полностью понимаю, что происходит. Благодаря! – Ecyrb