Один из подходов заключается в том, чтобы выразить запрос как своего рода объект в памяти, который вы можете добавить к нему. Например, при использовании некоторых составляют иерархию объектов:
var q = Table("Test1").Select("Name");
Вы бы дополнительно уточнить путем добавления фильтров:
q = q.Where("ID= 1");
Но, конечно, это означает, что вы Переизобретая IQueryable
. Вам лучше просто включить LINQ и выбрать поставщика (LINQ2SQL или LINQ2EF и т. Д.).
Другой подход, чтобы сохранить строку одноранговой представление:
var q = "Select Name from Test1";
но тогда как же добавить фильтр? Вы должны проанализировать строку и вставить предложение WHERE. Это далеко не тривиально. Вскоре вы будете внедрять полноценный SQL-парсер (lex + yacc или bison + flex) и абстрактное синтаксическое дерево, а затем сериализуйте его как новую строку SQL. Когда вы начинаете думать о присоединениях (довольно тривиально для поддержки), подзапросы (неприятные), рекурсивные табличные выражения (ouch) все усложняются. Просто просмотрите этот сайт и посмотрите, как могут возникать сложные SQL-запросы, и представьте, что вы можете выполнить синтаксический анализ для , который.
Многие из проектов, которые я видел, пытались представить запросы как некоторую промежуточную форму, например. структуру (список полей, имя таблицы, список условий WHERE, список предложений ORDER BY и т. д.), а затем добавить новые записи в это представление списка (добавьте новую запись в список WHERE, чтобы добавить новый фильтр). Но, ретроспективно, эти представления бледнеют по сравнению с тем, что предлагает LINQ. Я признаю, что LINQ - это предложение «все или ничего», и вы либо сами commit, либо нет. Но попытка заново изобрести его только раскрывает сложность проблемы. Сегодня я бы подошел к проблеме с другой стороны: начните с LINQ и попытайтесь удержать ее в страхе, не позволяйте ей превращаться в отвратительного монстра неконтролируемого инструмента генерации запросов, в котором каждый слой проекта добавляет некоторый фильтр в IQueryable
а затем бомбить сервер с помощью того, что оптимизатор не может даже распутать.
PS. Why I Wrote AREL - хороший обзор по всей этой проблеме.
Вы передаете запрос sql или командный класс между методами? Это поможет, если вы сможете дать больше информации о том, что вы пытаетесь сделать. Вы выполняете запрос, но можете ждать, чтобы обработать результаты? –
То, что Linq может быть закодировано вручную (например, [Edulinq] (http://msmvps.com/blogs/jon_skeet/archive/tags/Edulinq/default.aspx)). Что не так с тем, как работает Linq? – Brian