我有一个方法,目前需要一个Func<Product, string>
作为参数,但我需要它是一个Expression<Func<Product, string>>
。使用AdventureWorks,这里是我想用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
变量。有任何想法吗?
编辑:这里是我如何调用该方法的例子:
DoSomethingWithFunc(product => product.ProductSubcategory.Name);
不错!尽管如此,最后一行不是为我编译的,而是分配给结果的地方。 “方法的类型参数...不能从使用中推断出来。”我错过了什么吗? – Ecyrb 2009-10-20 17:42:12
应该将'Expression.Lambda'的返回值转换为'Expression>'。 –
2009-10-20 17:48:06
优秀!事实证明,这比我期待的要复杂得多。我从来没有像之前那样创建过自己的表达式,所以我会研究这些代码以确保我完全理解正在发生的事情。谢谢! – Ecyrb 2009-10-20 17:55:11