2010-09-23 85 views
0

我有一個nHibernate投影的問題。我甚至不知道我正在嘗試的是否可以完成,但是如果有任何nHibernate專家能夠幫助我,我將不勝感激。NHibernate的投影重複列表

我正在使用nHibernate標準來查詢數據庫,並且我將結果投影到一個不同的(瘦身)對象。

我得到這樣

Id CompanyId Description 
1  1   Desc1 
1  2   Desc1 
1  3   Desc1 
2  1   Desc2 
2  3   Desc2 
3  1   Desc3 
3  2   Desc3 
3  3   Desc3 

返回列表時,我使用這個對象

int Id 
int CompanyId 
string Description 

什麼我要找的是讓更多的東西一樣

Id CompanyId Description 
1 [1, 2, 3] Description 
2 [1, 3] Description 
3 [1, 2, 3] Description 

從像這樣的物體

int id 
List`<int`> companyId 
string description 

當前的代碼我有類似

result = session.CreateCriteria<Object>() 
      .Add(Restrictions.Eq("SiteId", 616)) 
      .SetProjection(Projections.Distinct(Projections.ProjectionList() 
      .Add(Projections.Property("Id"), "Id") 
      .Add(Projections.Property("CompanyId"), "CompanyId") 
      .Add(Projections.Property("Description"), "Description") 
      .SetResultTransformer(Transformers.AliasToBean<ObjectReduced>()).List<ObjectReduced>(); 

所以我想知道如果有什麼在這裏,我可以做實現這一目標,或者即使這是完全錯誤的做法並沒有更好的東西。

回答

1

你不能直接在NHibernate中做到這一點。達到此目的的最佳方法是按照您當前的方式獲取結果集,然後使用CompanyIds填充縮小的對象。喜歡的東西:

var temp = session.CreateCriteria<Object>() 
      .Add(Restrictions.Eq("SiteId", 616)) 
      .SetProjection(Projections.Distinct(Projections.ProjectionList() 
      .Add(Projections.Property("Id"), "Id") 
      .Add(Projections.Property("CompanyId"), "CompanyId") 
      .Add(Projections.Property("Description"), "Description") 
      .SetResultTransformer(Transformers.AliasToBean<ObjectReduced>()) 
      .List<ObjectReduced>(); 
var groups = temp.GroupBy(x => x.Id); 
var result = new List<ObjectReduced>(groups.Count()); 
foreach (var member in groups) 
{ 
    var first = member.First(); 
    var companyIds = member.Select(x => x.CompanyId); 
    foreach (var companyId in companyIds) 
    { 
     first.CompanyIds.Add(companyId); 
    } 
    result.Add(first); 
} 
return result; 

有可能是一個LINQier辦法做到這一點,但是這是我如何解決類似的問題。

+0

謝謝,我最終找回了對象列表,然後手動映射到ObjectReduced。我使用你的代碼來獲得對象組,併爲映射添加了幾行代碼。 – 2010-09-24 11:41:37