我第一次使用ASP.NET-MVC和NHibernate。很好的工具,但是学习曲线很大!
我有一个相当大的对象的列表视图(每个对象有大约60个属性)。在列表视图中,我只使用其中的10个属性。性能并不太差,但完全水合物似乎是浪费。推荐做法是什么?
我尝试使用HQL来选择较少的属性,但它似乎不会对对象进行部分水合。我还尝试在主对象上创建属性,该对象是具有列表视图属性的头类,但似乎无法正确映射它。我认为这应该很容易,但我一直在努力。
编辑:
我一直在想这个问题,因为我知道安东给了我答案,我就是看不见。
您需要做三件事:
-
使用所需的属性创建一个对象。
-
制作映射文件以导入此对象。
<
休眠映射
xmlns=“urn:nhibernate-mapping-2.2”
namespace=“core.entities”
程序集=“核心”
默认access=“property”>
<
import class=“请求头”/
>
<
/休眠映射
-
如果使用hql,则对象必须包含一个构造函数,该构造函数的所有属性的顺序与select new语句的顺序相同。如果使用标准API,则无需执行此操作。
public IList<RequestHeader> ListAll()
{
using (ISession session = GetSession())
{
using (ITransaction tx = session.BeginTransaction())
{
IList<RequestHeader> results = session.CreateCriteria(typeof (Request), "r")
.CreateCriteria("Requestor", "req", JoinType.InnerJoin)
.CreateCriteria("r.Grant", "g", JoinType.InnerJoin)
.SetProjection(Projections.ProjectionList()
.Add(Projections.Property("r.Id"), "Id")
.Add(Projections.Property("r.Status"), "Status")
.Add(Projections.Property("r.SubmissionDate"), "SubmissionDate")
.Add(Projections.Property("req.Name"), "Requestor")
.Add(Projections.Property("g.Number"), "Number"))
.SetResultTransformer(Transformers.AliasToBean(typeof (RequestHeader)))
.SetMaxResults(10000)
.List<RequestHeader>();
tx.Commit();
return results;
}
}
}