我对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>();
所以我想知道我能做些什么来实现这个目标,或者即使这是完全错误的方法,也有更好的方法。
答案 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方法可以解决这个问题。