NHibernate QueryOver, проекции и псевдонимы - PullRequest
2 голосов
/ 19 октября 2011

У меня проблема с nhibernate, когда я проецирую функцию sql Coalesce.

Я сравниваю два строковых свойства с одинаковым именем из двух разных сущностей. В полученном sql сравнивается одно и то же свойство только с первой сущностью:

var list = Projections.ProjectionList();
list.Add(
   Projections.SqlFunction("Coalesce",
    NHibernateUtil.String,
    Projections.Property<TranslatedText>(tt => tt.ItemText),
    Projections.Property<TextItem>(ti => ti.ItemText)));

var q = Session.QueryOver<TextItem>()
    .Left.JoinQueryOver(ti => ti.TranslatedItems);

Оценка результатов q в этом sql

coalesce(this_.ItemText, this_.ItemText)

this_ в RHS должен быть таблицей с псевдонимом

Я могу использовать Projections.Alias(Projections.Property<TranslatedText>(tt => tt.ItemText), "ttAlias"), но я не уверен, как отобразить "ttAlias" в JoinQueryOver.

Я тоже могу создать псевдоним, но не знаю, как его назвать.

TranslatedText ttAlias = null;
...
JoinQueryOver(ti => ti.TranslatedItems, () => ttAlias)

Ответы [ 2 ]

6 голосов
/ 19 октября 2011

Псевдонимы - это переменные в QueryOver, как вы показали в вызове JoinQueryOver. Имена псевдонимов (строки) не должны быть необходимы в QueryOver, они предназначены для запросов Criteria.

К самой проблеме: я не могу проверить это прямо сейчас, но я думаю, что это должно работать:

Projections.Property(() => ttAlias.ItemText)
0 голосов
/ 12 марта 2013

Я использовал эту тему в качестве ресурса при написании модульного теста. Этот QueryOver работает хорошо и может помочь другим с подобными проблемами. QueryOver по-прежнему борется с отображением свойств в преобразователи с помощью выражений. Технически возможно удалить «Id», но ИМХО это мешает ясности.

Полный пример на GitHub

         String LocalizedName = "LocalizedName";
         //Build a set of columns with a coalese
         ProjectionList plColumns = Projections.ProjectionList();
         plColumns.Add(Projections.Property<Entity>(x => x.Id), "Id");
         plColumns.Add(Projections.SqlFunction("coalesce",
                                               NHibernateUtil.String,
                                               Projections.Property<Entity>(x => x.EnglishName),
                                               Projections.Property<Entity>(x => x.GermanName))
                                  .WithAlias(() => LocalizedName));

         ProjectionList plDistinct = Projections.ProjectionList();
         plDistinct.Add(Projections.Distinct(plColumns));


         //Make sure we parse and run without error
         Assert.DoesNotThrow(() => session.QueryOver<Entity>()
                                          .Select(plDistinct)
                                          .TransformUsing(Transformers.AliasToBean<LocalizedEntity>())
                                          .OrderByAlias(() => LocalizedName).Asc
                                          .Skip(10)
                                          .Take(20)
                                          .List<LocalizedEntity>());
...