Создание Linq- ›HQL-провайдера

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

Клиент отправляет HQL-запросы на сервер и получает ответы. У клиента есть автоматически сгенерированный набор объектов, которые соответствуют объектам спящего режима сервера по результатам запроса и базовой персистентности.

Я хотел бы поддержать использование Linq для запросов, а также Hql, поскольку это делает запросы типизированными и более быстрыми для построения (больше никаких опечаток в строковых запросах HQL). Я посмотрел на следующее, но не могу понять, как заставить их соответствовать тому, что у меня есть.

  • Поставщик Linq NHibernate - требует использования NHibernate ISession и ISessionFactory, которых у меня нет
  • LinqExtender - требует много аннотаций к объектам и слишком агрессивно расширяет базовый тип

Что мне действительно нужно, так это то, что сгенерирует мне приятную, простую в обработке структуру для построения запросов HQL. Я прочитал большую часть 15-страничной статьи, написанной одним из разработчиков C # о том, как создавать собственные поставщики, и это довольно чревато, в основном из-за сложности дерева выражений.

Может ли кто-нибудь предложить подход к реализации перевода Linq -> HQL? Возможно, библиотека, которая очистит дерево выражений до чего-то более SQL / HQLish.

Я хотел бы поддержать select / from / where / group by / order by / joins. Не особо беспокоюсь о подзапросах.


person Mike Q    schedule 16.06.2010    source источник


Ответы (2)


Я не думаю, что есть какая-нибудь библиотека, которая это делает. Вы можете написать своего провайдера. Есть инструменты, которые помогут вам написать такого провайдера. Например, IQToolkit. Но учтите, что написание собственного провайдера по-прежнему требует много работы. Я не уверен, стоит ли это вложения.

person Steven    schedule 16.06.2010

Итак, я нашел эту библиотеку re-linq, которую NHibernate использует для реализации своей функциональности LINQ. Кажется, что убирает много шума вокруг выражений, хотя, кажется, есть немного, что нужно сделать поверх, чтобы создать реализацию.

re-linq

person Mike Q    schedule 18.06.2010