Как NHibernate 3 решает синтаксис QueryOver <>? - PullRequest
3 голосов
/ 28 июля 2010

Мне интересно, как команда NHibernate решила синтаксис QueryOver, чтобы он работал с intellisense и проверкой во время компиляции?

Согласно http://nhforge.org/blogs/nhibernate/archive/2009/12/17/queryover-in-nh-3-0.aspx они используют методы расширения и лямбда-выражения, но я попытался просмотреть исходный код, но он не совсем мне это объясняет.

Как они делают их безопасными во время компиляции, без необходимости использования прокси-классов, расширяющих их?

Я хотел бы «скопировать» это поведение, но для этого мне нужно некоторое базовое понимание концепции, любые указатели на документацию по этому вопросу также приветствуются.

1 Ответ

4 голосов
/ 28 июля 2010

Как и любая реализация LINQ, QueryOver использует Деревья выражений манипуляции во время выполнения. В частности, смотрите класс ExpressionProcessor, в нем есть словарь, который отображает выражения в функции, которые применяют ICriteria.

QueryOver также использует свободные методы интерфейса. Например, при вызове OrderBy он возвращает IQueryOverOrderBuilder, который четко определяет, какие операции доступны при оформлении заказа. Аналогично, есть тип IQueryOverRestrictionBuilder, который определяет доступные методы для ограничений. Это в отличие от многих простых реализаций интерфейса, которые всегда возвращают this, чтобы разрешить конкатенацию методов.

...