Как сделать неоперативное изменение в запросе linq, который появится в DbCommandTree в EF - PullRequest
0 голосов
/ 23 ноября 2011

У меня есть запрос linq

Context.Set<Entity>().where(x=>x.condition == true).select(x=> new ViewModel{Property = x.Property});

Я бы хотел внести изменения в запрос linq через что-то вроде этого

Context.Set<Entity>().ChangeLinqQuery("String").where(x=>x.condition == true).select(x=> new ViewModel{Property = x.Property});

Так что, когда я получу DbCommandTree в моем EFProviderWrapper, я смогу обнаружить изменения и захватить строку. Я также хотел бы быть уверен, что выражение применяется к этой конкретной ссылке на сущность, поэтому, если я присоединюсь к сущности, она все равно сможет сказать, что именно эту ссылку на сущность я хочу изменить.

Цель состоит в том, чтобы иметь возможность изменять SQL, сгенерированный EF, поэтому, если у вас есть более эффективные средства для достижения этой цели, пожалуйста, не стесняйтесь предоставить ее.

1 Ответ

1 голос
/ 23 ноября 2011

Я не думаю, что это возможно. Ваш ChangeLinqQuery должен будет добавить пользовательское выражение в дерево выражений, созданное сзади. Проблема в том, что это дерево выражений переведено на ESQL - это то, что описывает DbCommandTree (это не SQL). Как я знаю, ESQL не является расширяемым, и поэтому вы не можете добавлять какие-либо пользовательские выражения в этот процесс. Даже если бы вы могли, это также, скорее всего, означало бы, что вам придется переписывать большую часть генерации SQL, чтобы удовлетворить ваши потребности - не разработку оболочки поставщика, а самого поставщика.

Ваш лучший выбор с EF - просто заменить имена таблиц в сгенерированном SQL, что будет сложно, медленно, и если вы не создадите сильный синтаксический анализатор SQL, следуя его синтаксису, он также будет подвержен ошибкам.

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

...