如何从泛型函数委托中定义LINQ表达式

本文关键字:定义 LINQ 表达式 泛型 函数 | 更新日期: 2023-09-27 18:17:26

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

我想使用这个输入参数来加载EF实体,通过在DbContext的实例上使用这个方法:

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

Collection方法接受Expression<Func<TEntity, ICollection<TElement>>>类型的参数

我已经搜索了周围,但不能弄清楚如何从一个Func实例初始化一个表达式实例。有人知道吗?提前感谢!

如何从泛型函数委托中定义LINQ表达式

如果您将方法定义为接受表达式:

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

现在你可以通过lambda来调用它:

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

c#编译器会帮你把lambda转换成表达式

我已经搜索了周围,但不能弄清楚如何从一个Func实例初始化一个表达式实例。

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

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