2010-11-10 93 views
0

我在我的web應用程序中使用NHibernate,它與我的數據庫映射。我有一個模型,財產以後這樣的:NHibernate中的自定義填充集合

public class Company { 
    public virtual string Name { get; set; } 
    public virtual IList<Employee> Employeers { get; set; } 
} 

public class Employee { 
    public virtual string Name { get; set; } 
    public virtual DateTime Birthday { get; set; } 
    /* other properties */ 
    public virtual Company Company { get; set; } 
} 

PS:這不是真正的模式,但它適合我的樣品/疑慮......

我使用HQL讓我的對象,我會想知道是否有任何方法可以:

1)獲得一個公司對象,並填補僱主收入排名前10名僱員按生日Desc?

2)有沒有什麼辦法,當收集填充,填寫只有像名稱和生日一些領域?我有很多屬性,我不會在我看來使用。我可以爲此創建一個DTO,但我不知道該怎麼做!

謝謝

回答

2

持久性集合和實體表示當前狀態;他們不能只有一部分(想一想:如果他們這樣做,NH如何跟蹤變化?)

因此,在這兩種情況下,答案都是查詢和DTO。您可以使用HQL輕鬆檢索您需要的數據:

class EmployeeNameAndBirthDay 
{ 
    public string Name { get; set; } 
    public DateTime Birthday { get; set; } 
} 

public IList<EmployeeNameAndBirthDay> GetTopEmployees(Company company) 
{ 
    return session.CreateQuery(@" 
        select Name as Name, 
          Birthday as Birthday 
        from Employee 
        where Company = :company 
        order by Birthday desc 
        ") 
        .SetParameter("company", company) 
        .SetMaxResults(10) 
        .SetResultTransformer(
         Transformers.AliasToBean<EmployeeNameAndBirthDay>()) 
        .List<EmployeeNameAndBirthDay>(); 
} 
+0

嗨迭戈,感謝awser。那麼,它會正常工作,我想像這樣的事情。我會做的。但我很好奇,有沒有辦法與公司進行相同的hql查詢?未來是一個不錯的選擇?我正在使用NH 2.1 – 2010-11-10 13:26:38

+0

您已經擁有該公司,您需要什麼?之後將其添加到DTO中。無論如何,如果你真的想這樣做,只需在選擇列表和DTO中添加「Company」。 – 2010-11-10 13:29:10

+0

我明白了!感謝Diego ... – 2010-11-10 13:31:31