我有一个方法,目前它接受一个Func<Product, string>
作为参数,但我需要它成为一个Expression<Func<Product, string>>
。使用AdventureWorks,以下是我想使用Func完成的示例。
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,因为会引起问题。我也找不出如何使用 Expression,因为我不知道如何传递 product
变量。有什么建议吗?
编辑: 这里是我如何调用该方法的示例:
DoSomethingWithFunc(product => product.ProductSubcategory.Name);
Expression.Lambda
的返回值应该转换为Expression<Func<Product, ResultType>>
。 - Ben MExpression.Lambda>(...
而不是强制转换。 - Ecyrb