gpt4 book ai didi

c# - 将 Func 重构为 Expression>

转载 作者:太空狗 更新时间:2023-10-29 23:04:35 24 4
gpt4 key购买 nike

我有一个方法目前需要 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我的 key 的第二部分的变量我可能会这样说:

var result = db.Products.GroupBy(myExpression);

但我确实需要 product变量,因为我确实需要 key 的第二部分 (ProductNumber)。所以我不太确定现在该怎么办。我不能将它保留为 Func,因为这会导致问题。我不知道如何使用表达式,因为我不知道如何将它传递给 product多变的。有什么想法吗?

编辑:这是我如何调用该方法的示例:

DoSomethingWithFunc(product => product.ProductSubcategory.Name);

最佳答案

无法拼接表示为 Expression<T> 的表达式树对象进入由 lambda 表达式表示的“树文字”的中间。您必须构建一个表达式树以传递给 GroupBy手动:

// Need an explicitly named type to reference in typeof()
private class ResultType
{
public string SubcategoryName { get; set; }
public int ProductNumber { get; set; }|
}

private static void DoSomethingWithExpression(
Expression<Func<Product,
string>> myExpression)
{
var productParam = Expression.Parameter(typeof(Product), "product");
var groupExpr = (Expression<Func<Product, ResultType>>)Expression.Lambda(
Expression.MemberInit(
Expression.New(typeof(ResultType)),
Expression.Bind(
typeof(ResultType).GetProperty("SubcategoryName"),
Expression.Invoke(myExpression, productParam)),
Expression.Bind(
typeof(ResultType).GetProperty("ProductNumber"),
Expression.Property(productParam, "ProductNumber"))),
productParam);
using (AdventureWorksDataContext db = new AdventureWorksDataContext())
{
var result = db.Products.GroupBy(groupExpr);
}
}

关于c# - 将 Func<T> 重构为 Expression<Func<T>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1595940/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com