2011-10-19 98 views
2

我有一個nhibernate問題,我投影了sql coalesce函數。NHibernate的QueryOver,投影和別名

我比較兩個不同實體具有相同名稱的字符串屬性。在產生的SQL,只從第一實體相同的屬性被因而比較:在此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結果

coalesce(this_.ItemText, this_.ItemText) 

在RHS的this_需要是別名的表

我可以使用Projections.Alias(Projections.Property<TranslatedText>(tt => tt.ItemText), "ttAlias")但我不知道如何在JoinQueryOver中映射「ttAlias」。

我也可以在那裏創建一個別名,但看不到如何命名它。

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

回答

6

別名是QueryOver中的變量,就像您在JoinQueryOver調用中顯示的一樣。 QueryOver中不需要別名(字符串),它們用於Criteria查詢。

爲了本身的問題:我現在不能測試,但我認爲這應該工作:

Projections.Property(() => ttAlias.ItemText) 
+0

有道理,當你知道如何...謝謝! –

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>()); 
+0

雖然可能有幫助,但這似乎脫離了這個問題的話題。其他人是否同意? – Reimius