Я хочу переписать определенные части выражения LINQ непосредственно перед выполнением. И у меня проблемы с вводом моего рерайтера в нужное место (на самом деле вообще).
Глядя на источник Entity Framework (в рефлекторе), он в конце концов сводится к IQueryProvider.Execute
, который в EF связан с выражением ObjectContext
, предлагающим свойство internal IQueryProvider Provider { get; }
.
Поэтому я создал класс-оболочку (реализующий IQueryProvider
), чтобы выполнить перезапись выражения при вызове Execute, а затем передать его исходному провайдеру.
Проблема в том, что поле за Provider
равно private ObjectQueryProvider _queryProvider;
. Этот ObjectQueryProvider
является внутренним запечатанным классом, что означает невозможность создания подкласса, предлагающего добавленную переписку.
Так что этот подход загнал меня в тупик из-за очень тесно связанного ObjectContext.
Как решить эту проблему? Я смотрю в неправильном направлении? Возможно, есть способ ввести себя вокруг этого ObjectQueryProvider
?
Обновление: хотя все предоставленные решения работают, когда вы «обертываете» ObjectContext с помощью шаблона репозитория, предпочтительнее было бы решение, позволяющее напрямую использовать сгенерированный подкласс из ObjectContext. Тем самым оставаясь совместимым с каркасом динамических данных.