NHibernate Projections重复列表

时间:2010-09-23 15:50:32

标签: .net nhibernate fluent-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 个答案:

答案 0 :(得分:2)

你不能直接在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方法可以解决这个问题。