2

我有一个休眠问题,我正在投影 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);

在这个 sql 中评估 q 结果

coalesce(this_.ItemText, this_.ItemText)

RHS中this_的 需要是别名表

我可以使用 Projections.Alias(Projections.Property<TranslatedText>(tt => tt.ItemText), "ttAlias")但不确定如何在JoinQueryOver.

我也可以在那里创建一个别名,但看不到如何命名它。

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

2 回答 2

6

别名是 QueryOver 中的变量,就像您在JoinQueryOver调用中显示的那样。QueryOver 中不需要别名(字符串),它们用于 Criteria 查询。

对于问题本身:我现在无法测试它,但我认为这应该可行:

Projections.Property(() => ttAlias.ItemText)
于 2011-10-19T13:32:21.590 回答
0

我在编写单元测试时将此主题用作资源。这个 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>());
于 2013-03-11T21:28:12.277 回答