2013-10-08 49 views
1

很難找到如何解決我的問題,所以我張貼在這裏。NHibernate QueryOver - 選擇連接表的子節點的一個字段

public class A 
{ 
    public int IdA { get; set; } 
    public List<AB> ABs { get; set; } 
} 

public class AB 
{ 
    public A ObjectA { get; set; } 
    public B ObjectB { get; set; } 
} 

public class B 
{ 
    public int IdB { get; set; } 
    public string Name { get; set; } 
} 

我想找到QueryOver的方式,來獲取這個列表DTO

public class DTO 
{ 
    public int IdA { get; set; } 
    public List<string> Names { get; set; } 
} 

正如你所看到的,我想有對象B的foreach對象的所有「名稱」屬性B在我的AB房產中找到。

如果你知道該怎麼做,你能幫我嗎?

回答

2

有幾個方法可以做到這一點,但沒有我在知道的只是 QueryOver。您可以將QueryOver查詢視爲幾乎直接轉換爲SQL。如果你這樣想,就不可能在一個步驟中填充List屬性(你不能編寫一個導致ID和項目「列表」的SQL查詢,至少不使用某種聚合) 。

考慮到這一點,我認爲最好在這裏定義一種新型的中間DTO。

public class FlattenedDTO 
{ 
    public int IdA { get; set; } 
    public string Name { get; set; } 
} 

然後你會寫你的查詢,預測到FlattenedDTO。我們選取了後的FlattenedDTO S,我們可以將它們分組列表進入DTO個新的列表:

B bAlias = null; 
FlattenedDTO result = null; 

session.QueryOver<A>() 
    .JoinQueryOver<AB>(a => a.ABs) 
    .JoinQueryOver(ab => ab.B,() => bAlias) 
    .SelectList(list => list 
     .Select(a => a.Id).WithAlias(() => result.IdA) 
     .Select(() => bAlias.Name).WithAlias(() => result.Name)) 
    .TransformUsing(Transformers.AliasToBean<FlattenedDTO>()) 
    .List<FlattenedDTO>() 
    // At this point the query has been run and we just need to group the results 
    .GroupBy(dto => dto.IdA, dto => dto.Name) 
    .Select(grp => new DTO { IdA = grp.Key, Names = grp.ToList() }); 

這最終會發出一個查詢:

SELECT this_.IdA  as y0_, 
     balias2_.Name as y1_ 
FROM [A] this_ 
     inner join [AB] ab1_ 
     on this_.Id = ab1_.IdA 
     inner join [B] balias2_ 
     on ab1_.IdB = balias2_.Id 

和分組在內存中的結果。還有其他一些方法可以做到這一點,所以讓我知道如果這不符合您的需求。

+0

非常感謝!它運作良好。我誤解了QueryOver的一些原則... – Toben

1

你必須創建一個表& NHibernate的映射,在那裏編寫一個查詢用的hbm.xml映射像

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NSP.DataModel" namespace="NSP.DataModel.A"> 
    <class name="A" entity-name="SysA" table="A"> 
    <id name="IdA" column="id" type="Int32"> 
     <generator class="identity"/> 
    </id> 

    <bag name="DTO" inverse="true"> 
     <key column="IdA"/> 
     <one-to-many entity-name="Names"/> 
    </bag> 

    </class> 
</hibernate-mapping> 
+0

對不起,我沒有說我正在使用FluentNHibernate ... – Toben

相關問題