2

sqlCoalesce関数を投影しているnhibernateの問題があります。

2つの異なるエンティティからの同じ名前の2つの文字列プロパティを比較しています。結果の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)

RHSのthis_はエイリアステーブルである必要があります

を使用することはできます Projections.Alias(Projections.Property<TranslatedText>(tt => tt.ItemText), "ttAlias")が、で「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」を削除することは技術的には可能ですが、IMHOは明確さを妨げます。

完全な例は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 に答える