2010-09-23 52 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