Как определить выражение LINQ из общего делегата Func?
Скажем, у меня есть метод с входным параметром с именем collectionSelector
типа Func<TEntity, ICollection<TCollection>>
,
Я хотел бы использовать этот входной параметр для загрузки объектов EF, используя этот метод на экземпляре DbContext
:
context.Entry(entity).Collection(collectionExpression).Load()
Метод Collection принимает параметр типа Expression<Func<TEntity, ICollection<TElement>>>
Я искал вокруг, но не могу понять, как инициализировать экземпляр Expression из экземпляра Func. Есть идеи? Заранее спасибо!
2 ответа
Как насчет того, чтобы определить свой метод для выражения:
void Process(Expression<Func<TEntity,ICollection<TCollection>>> collectionSelector)
{
context.Entry(entity).Collection(collectionExpression).Load()
}
Теперь вы можете назвать это передачей в лямбду:
Process(x=>x.GenerateCollection());
А компилятор C# позаботится о преобразовании лямбды в выражение для вас.
Я искал вокруг, но не могу понять, как инициализировать экземпляр Expression из экземпляра Func.
Ты не можешь Func
это делегат, который указывает на скомпилированный метод, нет способа получить дерево выражений из этого (ну, возможно, это возможно, но, конечно, не так легко, так как вам нужно будет декомпилировать метод).
В зависимости от контекста лямбда-выражение может быть скомпилировано либо в анонимный метод, либо в дерево выражений. Нет преобразования между методом и выражением...