Mam metodę, która obecnie przyjmuje jako parametr Func<Product, string>
, ale potrzebuję go jako Expression<Func<Product, string>>
. Korzystając z AdventureWorks, oto przykład tego, co chciałbym zrobić za pomocą Func.Refaktoryzacja Func <T> w Wyrażenie <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
});
}
}
Chciałabym to wyglądać mniej więcej tak:
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
});
}
}
Jednak problem biegnę na to, że myExpression(product)
jest nieprawidłowy (nie będzie kompilować). Po przeczytaniu kilku innych postów rozumiem dlaczego. A jeśli to nie dla faktu, że muszę zmienną product
do drugiej części mojego klucza pewnie mógł powiedzieć coś takiego:
var result = db.Products.GroupBy(myExpression);
Ale potrzebujemy zmiennej product
bo trzeba zrobić drugi część klucza (numer produktu). Więc nie jestem naprawdę pewien, co teraz zrobić. Nie mogę tego zostawić jako Func, ponieważ powoduje to problemy. Nie mogę się dowiedzieć, jak użyć wyrażenia, ponieważ nie widzę sposobu, w jaki mogę przekazać mu zmienną product
. Jakieś pomysły?
EDIT: Oto przykład jak nazwałbym metodę:
DoSomethingWithFunc(product => product.ProductSubcategory.Name);
Nice! Jednak ostatnia linia nie jest dla mnie kompilacją, gdzie wynik jest przypisany. "Argumentów typu dla metody ... nie można wywnioskować z użycia." Czy czegoś brakuje? – Ecyrb
Wartość zwracana z 'Expression.Lambda' powinna być rzutowana na' Expression> '. –
Doskonale! Okazało się to bardziej złożone, niż się spodziewałem. Nigdy wcześniej nie robiłem tego w taki sposób, więc będę studiować ten kod, aby upewnić się, że w pełni rozumiem, co się dzieje. Dzięki! – Ecyrb