2011-06-09 33 views
1

我有這些實體:NHibernate和「匿名」實體

public class Parent 
{ 
    public int Foo { get; set; } 
    public Child C { get; set; } 
} 

public class Child 
{ 
    public string Name { get; set; } 
} 

我有查詢其獲取所有父實體從數據庫中。然後我將它們保存在內存中,並使用LINQ查詢進行過濾。

我注意到當我做數據庫查詢時,NH在一個查詢中選擇了所有的父實體(當然也填充了Foo屬性),並且對於每個使用LINQ訪問的父母,NH獲取每個子的信息。

如何在一個獨特的數據庫中獲取我需要的所有信息,並在沒有它的情況下使用LINQ中的數據生成額外的數據庫行程?

我應該使用AliasToBeanResultTransformer嗎?如果是這樣,我必須創建一個DTO來存儲信息,如:

public class ParentDTO 
{ 
    public int Foo { get; set; } 
    public string ChildName { get; set; } 
} 

還是必須仍然使用父類?

在此先感謝

回答

4

您可以加載熱切此查詢像這樣的兒童(使用QueryOver語法)

public IList<Parent> FindAllParentsWithChildren() 
{ 
    ISession s = // Get session 
    return s.QueryOver<Parent>() 
    .Fetch(p => p.C).Eager 
    .List<Parent>(); 
} 

另一種方法是改變你的HBM文件,以表明孩子是熱切默認加載。那麼你將不需要改變你的查詢。

0

你需要告訴NHibernate的不使用延遲加載的父母與子女實體之間的關係。

+0

我怎麼能這麼想:D – Mike 2011-06-09 20:56:40

+1

這實際上是一個壞主意。使用緩存,批處理和ad-hoc連接抓取更好(請參閱Carl的答案) – 2011-06-10 18:18:54