Как определить выражение LINQ из общего делегата Func? - PullRequest
1 голос
/ 08 декабря 2011

Скажем, у меня есть метод с входным параметром с именем collectionSelector типа Func<TEntity, ICollection<TCollection>>.

Я хотел бы использовать этот входной параметр для загрузки сущностей EF с помощью этого метода в экземпляре DbContext:

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

Метод сбора параметр типа Expression<Func<TEntity, ICollection<TElement>>>

Я искал вокруг, но не могу понять, как инициализировать экземпляр Expression из экземпляра Func.Есть идеи?Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 08 декабря 2011

Как насчет того, чтобы определить свой метод для выражения:

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

Теперь вы можете вызывать его, передавая лямбду:

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

И компилятор C # позаботитсяпреобразования лямбды в выражение для вас.

1 голос
/ 08 декабря 2011

Я искал, но не могу понять, как инициализировать экземпляр Expression из экземпляра Func.

Ты не можешь. Func - это делегат, указывающий на скомпилированный метод, нет способа получить дерево выражений из этого (ну, возможно, это возможно, но, конечно, не так просто, поскольку вам потребуется декомпилировать метод).

В зависимости от контекста лямбда-выражение может быть скомпилировано либо в анонимный метод, либо в дерево выражений. Между методом и выражением нет преобразования ...

...