Для кого-то еще с таким же вопросом. Извлечь предложение where из LINQ-to-SQL не так просто, как можно было бы надеяться. Кроме того, делать это само по себе, вероятно, бессмысленно. Есть несколько опций, в зависимости от требований - либо извлечь ее из сгенерированной строки, но тогда она будет содержать ссылки на параметры и сопоставления свойств объекта, которые также должны быть разрешены, поэтому их также нужно будет извлечь из Оригинальный провайдер как-то, иначе это было бы бессмысленно. Другой вариант - найти модульного провайдера, который может это сделать, а также сделать сопоставления элементов легко доступными, но, опять же, без остальной части запроса, я вижу небольшую полезность в этом, потому что предложение where будет ссылаться на таблицу / псевдонимы столбцов из оператора select.
У меня была похожая задача написать пару лет назад полноценного провайдера для пользовательского ORM / DAL. Хотя это квалифицируется как самая сложная вещь, над которой я работал, будучи опытным разработчиком, я могу сказать, что это не так плохо, как утверждают некоторые люди, как только вы начинаете думать о концепциях, лежащих в основе такого компонента. Некоторые решения, которые я видел, идут не так, как надо, добавляют избыточную функциональность и имеют дополнительный код для решения проблем, связанных с базовой логикой. Например. этап / модуль «оптимизации», который пытается повторно разложить раздутый, вложенный SQL, созданный основным анализатором. Если последний был спроектирован таким образом, чтобы с самого начала выводить чистый SQL, то фаза очистки не потребовалась бы. Я видел поставщиков, которые создают новый уровень вложенности для каждого запроса where и join. Это плохая стратегия. Разбивая запрос на три / четыре основных части - выберите, откуда и где - по порядку, которые строятся отдельно при посещении дерева, эта проблема полностью исключается. Я разработал объект-к-данным (он же LINQ-to-SQL), предоставленный на основе этих принципов для пользовательского ORM / DAL, и он производит хороший, чистый SQL с превосходной производительностью, так как каждый оператор компилируется в IL и кэшируются.
Для тех, кто хочет сделать что-то подобное, пожалуйста, смотрите мои посты, которые включают в себя пример проекта с реализацией учебника / barebones, который позволяет легко увидеть, как он работает. Включено также полное решение: