Каналы, фильтры и CompiledQuery.Compile

Я начал использовать linq to sql и фреймворк entity и обнаружил, что опыт разработки довольно хороший. То, как вы можете разбить запрос на части и комбинировать разные запросы, довольно приятно - см. Каналы и фильтры.

Но проблема, которую я обнаружил, заключается в том, что производительность может быть значительно увеличена (в моем случае примерно в 4 раза, что я не могу игнорировать), если я использую выполненные запросы. Но проблема, которую я обнаружил с скомпилированными запросами, заключается в том, что им не нравится работать с IQueryable ...

Есть ли у кого-нибудь идеи, как я могу обойти этот недостаток ??? Я работал так: скомпилированный запрос просто ссылался на другие запросы, которые использовали IQueryable, так что я мог переключаться на использование скомпилированных запросов или нет. Но, как я выяснил, это работает не так хорошо.

Любые идеи?

Ура Энтони


person vdh_ant    schedule 16.09.2009    source источник


Ответы (1)


Нет, вы не можете объединить результаты CompiledQuery с другим IQueryable. Помните, что единственная цель CompiledQuery - кэшировать результаты преобразования IQueryable в каноническое дерево команд Entity Framework. Если бы вы могли затем скомпоновать это с другим IQueryable, то его нужно было бы перекомпилировать для выполнения, что полностью противоречит цели CompiledQuery.

person Craig Stuntz    schedule 16.09.2009
comment
Значит ли это, что если вы хотите использовать скомпилированные запросы, нет возможности повторно использовать логику, как, скажем, если бы вы не использовали скомпилированные запросы и не использовали каналы и фильтры? - person vdh_ant; 17.09.2009
comment
Это действительно означает, что CompiledQuery очень похож на подготовленный оператор SQL. Другими словами, вы можете изменять значения аргументов (параметров), но не можете скомпоновать этот оператор с другими операторами SQL. Это имеет смысл, поскольку цель подготовки оператора SQL - гарантировать, что вы понесете накладные расходы на синтаксический анализ запроса и выделение ресурсов сервера только один раз для оператора, который вы будете выполнять несколько раз (возможно, с разными значениями параметров). CompiledQuery - то же самое, только для выражений. - person Craig Stuntz; 17.09.2009
comment
Я знаю, что вы говорите, но не было бы более логичным было бы сначала оценить выражение, учитывая каналы и фильтры, а затем кэшировать результаты ... - person vdh_ant; 21.09.2009
comment
EF уже делает это для нескомпилированных запросов в течение срока существования одного ObjectContext. Для этой функции вам не нужен CompiledQuery. - person Craig Stuntz; 21.09.2009