如何使用nHibernate为列表视图获取一小部分对象属性

时间:2009-07-24 11:02:10

标签: asp.net-mvc nhibernate

我第一次使用ASP.NET-MVC和nHibernate。很棒的工具,但学习曲线很大!

我有一个非常大的对象列表视图(每个对象有大约60个属性)。在列表视图中,我只使用了大约10个这些属性。性能并不算太差,但完全保湿这些物体似乎是浪费。建议的做法是什么?

我尝试使用HQL来选择更少的属性,但似乎它不会对对象进行部分保湿。我还尝试在主对象上创建属性,该属性是具有列表视图属性的头类,但我似乎无法正确映射它。我认为这应该很容易,但我真的一直在努力。

修改 我一直回到这里因为我知道安东给了我答案而我却看不到它。

您需要做三件事:

  1. 使用您想要的属性创建一个对象。
  2. 制作一个映射文件以导入此对象。

    <冬眠映射   的xmlns = “瓮:NHibernate的映射-2.2”   命名空间= “Core.Entities”   组件=“核心”   缺省存取= “属性” &GT;
          < import class =“RequestHeader”/ >
    < /休眠映射&GT;

  3. 如果您使用的是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;
            }
        }
    }
    

1 个答案:

答案 0 :(得分:1)

60个属性太多了。请参阅Component mapping

至于选择属性的子集,请参阅this:您需要select new HQL构造。但请注意,您需要一个合适的构造函数,并且您将获得的对象无法保存回数据库。