代码之家  ›  专栏  ›  技术社区  ›  Les

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

  •  2
  • Les  · 技术社区  · 15 年前

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

    我有一个相当大的对象的列表视图(每个对象有大约60个属性)。在列表视图中,我只使用其中的10个属性。性能并不太差,但完全水合物似乎是浪费。推荐做法是什么?

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

    编辑: 我一直在想这个问题,因为我知道安东给了我答案,我就是看不见。

    您需要做三件事:

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

      < 休眠映射 xmlns=“urn:nhibernate-mapping-2.2” namespace=“core.entities” 程序集=“核心” 默认access=“property”>
      < import class=“请求头”/ >
      < /休眠映射

    3. 如果使用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;
              }
          }
      }
      
    1 回复  |  直到 15 年前
        1
  •  1
  •   Anton Gogolev    15 年前

    60属性太多。见 Component mapping .

    关于选择属性子集,请参见 this 你需要一个 select new HQL构建。但是,请注意,您需要一个适当的构造函数,并且您将得到的对象不能保存回数据库。