Что можно использовать в качестве псевдонима NHibernate QueryOver? - PullRequest
1 голос
/ 01 августа 2011

Я знаю, что локальная переменная или локальное свойство могут быть использованы в качестве псевдонима, например

ClassA _aliasA;
_session.QueryOver(x => x.ClassA, () => _aliasA);

или

ClassA AliasA { get; set; }
_session.QueryOver(x => x.ClassA, () => AliasA);

Я хочу знать, какие возможны другие варианты. Например, допустимы ли свойства внешнего класса?

class ClassGenericAliases
{
    ClassA Class { get; set; }
}

_session.QueryOver(x => x.ClassA, () => ClassGenericAliases.ClassA);

Может ли статика использоваться в качестве псевдонимов? Есть ли другие варианты объявления псевдонимов?

Ответы [ 2 ]

7 голосов
/ 01 августа 2011

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

QueryOver - строго типизированная версия Criteria, в Criteria псевдонимом является строковое значение.

IList cats = sess.CreateCriteria(typeof(Cat))
    .CreateAlias("Kittens", "kt")
    .CreateAlias("Mate", "mt")
    .Add( Expression.EqProperty("kt.Name", "mt.Name") )
    .List();

Но теперь ему нужно присвоить псевдоним переменной, поэтому мы просто создадим его для него:

Cat catAlias = null;
Kitten kittenAlias = null;

IQueryOver<Cat,Cat> catQuery =
    session.QueryOver<Cat>(() => catAlias)
        .JoinAlias(() => catAlias.Kittens, () => kittenAlias)
        .Where(() => catAlias.Age > 5)
        .And(() => kittenAlias.Name == "Tiddles");

Из документации NHForge сказано следующее:

http://nhibernate.info/doc/nh/en/index.html#queryqueryover-aliases

15,5.Псевдонимы

В традиционном интерфейсе ICriteria псевдонимы назначаются с использованием «магических строк», однако их значение не соответствует имени в домене объекта.Например, когда псевдоним назначается с помощью .CreateAlias ​​(«Kitten», «kittenAlias»), строка «kittenAlias» не соответствует свойству или классу в домене.

В QueryOver псевдонимы назначаются с помощью пустой переменной.Переменная может быть объявлена ​​где угодно (но должна быть нулевой во время выполнения).Затем компилятор может проверить, правильно ли используется синтаксис для переменной, но во время выполнения переменная не оценивается (она просто используется в качестве заполнителя для псевдонима).

Каждая функция лямбда-выражений в QueryOver имеет соответствующую перегрузку, позволяющую использовать псевдонимы, и функцию .JoinAlias ​​для обхода ассоциаций с использованием псевдонимов без создания вложенного QueryOver.

Так что придерживайтесьпросто использовать переменную в области видимости метода.

2 голосов
/ 03 мая 2012

Мне нужно было решить аналогичную проблему и принять решение о присвоении псевдонимов. Затем, где бы вам ни понадобилось повторно использовать псевдоним, вы можете проверить его с помощью GetCriteriaByAlias ​​() и добавить его, если его там нет. Возможность повторного использования псевдонима очень удобна, если у вас разные проекции. Этот метод все еще проблематичен, если кто-то игнорирует соглашения об именах, но тогда ваши юнит-тесты должны его поднять.

Project aProject = null;
if (root.UnderlyingCriteria.GetCriteriaByAlias("aProject") == null)
    root.JoinAlias(i => i.Project, () => aProject);
...