2009-04-03 2 views
4

Насколько легко было бы написать немой провайдер LINQ, который может просто использовать определения моего класса (которые не имеют ссылок на объекты как свойства) и дать мне переведенный SQL. Он может считать имя свойств и столбцов одинаковыми, а также имена классов и базовых таблиц. Не могли бы вы дать мне несколько указателей?Простой (немой) поставщик LINQ

ответ

5

Мне потребовалось около 4 месяцев полной работы (8 часов в день), чтобы построить стабильного, работающего провайдера, который реализует всю спецификацию linq. Я бы сказал, что через три недели у меня была очень простая, багровая и неустойчивая версия, поэтому, если вы просто ищете что-то грубое, я бы сказал, что вы, вероятно, смотрите на что-либо от недели до двух месяцев в зависимости от того, насколько вы хороши и какие типы требований вы имеете.

Я должен указать вам на блог Wayward, Мэтт написал действительно хорошее пошаговое руководство о том, как реализовать провайдера linq, и даже если вы, вероятно, не сможете копировать и вставлять, это поможет вы должны понять, как думать при работе. Вы можете найти прохождение Мэтта здесь: http://blogs.msdn.com/mattwar/archive/2007/07/30/linq-building-an-iqueryable-provider-part-i.aspx. Я рекомендую вам поступить так же, как это делает Мэтт, и продлить изображение, которое посетитель Matt отображает во второй части его учебника.

Кроме того, когда я начал работать с этим, я так сильно помог от визуализатора дерева выражений, он действительно упростил синтаксический анализ, как только вы увидели, как linq анализируется на запросы.

Построение провайдера на самом деле очень весело, даже если немного разочаровывает время от времени. Желаю вам удачи!

4

Посмотрите на проект LINQExtender, это инструментарий для создания пользовательских поставщиков LINQ.

3

Еще одна возможность дать вам ногу вверх re-linq, которая является основой для создания пользовательских поставщиков LINQ.

Вот Source code и хороший overview (pdf) того, что связано с написанием одного.

0

Я создал проект «LinqToAnything», который разработан, чтобы сделать его очень простым для внедрения (простого) поставщика Linq.

1

Я написал серию учебников по моей базе блогов о своем опыте разработки LINQ-to-SQL-провайдера с нуля, начиная с этапа составления дерева выражений (вызывая методы LINQ), продолжая работу с посетителем выражения вниз по запросу в компоненты, анализируя предложение where, генерируя текст и параметр и, в конечном счете, компилируя все это в IL, используя пространство имен выражения .NET.

Я видел много незавершенных сообщений, которые обещали объяснить, как написать провайдер, очень сильно отстающий от знака, едва царапая поверхность и фактически не доставляя ничего удаленно исполняемого.

Серия блога, написанная на основе моего опыта, имеет примерный проект, доступный для загрузки с простым провайдером, который охватывает только те функции, которые требуются в примере с учебником. Тем не менее, он также включает в себя производственную версию, поддерживающую ряд операций (где, объединение, первое, количество, верх и т. Д.), Подзапросы, вложенные операторы и т. Д. Кроме того, он создает более чистый SQL, чем много того, вы видели из Entities и LINQ-to-SQL. Там нет ненужного/избыточного гнездования, обертывания всего в скобках и т. Д.

Для тех, у кого хороший уровень абстрактного мышления, разработка такого провайдера не такая сложная задача, которую многие из них задают.Я разработал один, который используется в производственной среде примерно за 3 месяца неполной работы (что означает некоторые вечера и выходные). С самого начала он был нацелен на производительность и аккуратность SQL - цель, которую она достигла.

Это было немного трудно найти время, чтобы опубликовать этот материал, но я подумал, - если это может помочь кому-то там, нет никаких оснований для этого опыта, чтобы пропадать: