如何从泛型Func委托定义LINQ表达式?

时间:2011-12-08 10:41:46

标签: c# .net generics delegates expression-trees

假设我有一个方法,其输入参数名为collectionSelector,类型为Func<TEntity, ICollection<TCollection>>

我想使用此输入参数在DbContext的实例上使用此方法加载EF实体:

context.Entry(entity).Collection(collectionExpression).Load()

Collection method接受Expression<Func<TEntity, ICollection<TElement>>>

类型的参数

我已经四处搜索,但无法弄清楚如何从Func实例初始化Expression实例。有人有想法吗?提前谢谢!

2 个答案:

答案 0 :(得分:1)

  

我一直在搜索,但无法弄清楚如何从Func实例初始化Expression实例。

你做不到。 Func是指向编译方法的委托,没有办法从中获取表达式树(好吧,也许它可能,但肯定不容易,因为你需要反编译该方法)。

根据上下文,lambda表达式可以编译为匿名方法或表达式树。方法和表达式之间没有转换......

答案 1 :(得分:1)

如果定义表达式来获取表达式,那该怎么样:

void Process(Expression<Func<TEntity,ICollection<TCollection>>> collectionSelector)
{
  context.Entry(entity).Collection(collectionExpression).Load()
}

现在你可以调用它传入一个lambda:

Process(x=>x.GenerateCollection());

C#编译器会负责将lambda转换为表达式。