我第一次使用ASP.NET-MVC和nHibernate。很棒的工具,但学习曲线很大!
我有一个非常大的对象列表视图(每个对象有大约60个属性)。在列表视图中,我只使用了大约10个这些属性。性能并不算太差,但完全保湿这些物体似乎是浪费。建议的做法是什么?
我尝试使用HQL来选择更少的属性,但似乎它不会对对象进行部分保湿。我还尝试在主对象上创建属性,该属性是具有列表视图属性的头类,但我似乎无法正确映射它。我认为这应该很容易,但我真的一直在努力。
修改 我一直回到这里因为我知道安东给了我答案而我却看不到它。
您需要做三件事:
制作一个映射文件以导入此对象。
<
冬眠映射
的xmlns = “瓮:NHibernate的映射-2.2”
命名空间= “Core.Entities”
组件=“核心”
缺省存取= “属性” &GT;
<
import class =“RequestHeader”/ >
<
/休眠映射&GT;
如果您使用的是HQL,则您的对象必须包含一个构造函数,该构造函数的所有属性与您的select新语句的顺序相同。如果您使用Criteria 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;
}
}
}
答案 0 :(得分:1)
60个属性太多了。请参阅Component mapping。
至于选择属性的子集,请参阅this:您需要select new
HQL构造。但请注意,您需要一个合适的构造函数,并且您将获得的对象无法保存回数据库。