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