在NHibernate中对子对象进行排序

时间:2009-11-16 14:32:00

标签: nhibernate

我有一个加载产品集合的方法。每个订单都有一个名为Manufacturer的子对象(我在映射文件中设置了多对一关系)。我想按Products.Manufacturer.Name排序产品系列。我怎么能这样做?

产品映射:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="Model.Catalog.Product,Model" table="Catalog.Product">
    <id name="ID" column="ID" type="Int32" unsaved-value="0">
      <generator class="native" />
    </id>
    <property name="Name" column="Name" type="string" length="50" not-null="true" />
    <property name="Description" column="Description" type="String" not-null="false" />
    <property name="CreatedByUserId" column="CreatedByUserId" type="Guid" not-null="true" />
    <many-to-one name="Manufacturer" column="ManufacturerID" not-null="true" class="Catalog.Manufacturer,Model" />
   </class>
</hibernate-mapping>

制造商映射:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="Model.Catalog.Manufacturer,Model" table="Catalog.Manufacturer">
    <id name="ID" column="ID" type="Int32" unsaved-value="0">
      <generator class="native" />
    </id>
    <property name="Name" column="Name" type="string" length="50" not-null="true" />
  </class>
</hibernate-mapping>

致电代码:

public IList<Model.Catalog.Product> GetProducts(int startIndex, int rowCount, string sort, string productNameFilter, int? manufacturerIDFilter)
{
    IList<Model.Catalog.Product> result = null;

    using (ITransaction transaction = this.Session.BeginTransaction())
    {
        ICriteria query = this.Session.CreateCriteria<Model.Catalog.Product>();

        //Add paging...
        query.SetFirstResult(startIndex).SetMaxResults(rowCount);

        //Add filters...
        if (productNameFilter != null)
        {
            query.Add(Expression.Like("Name", productNameFilter, MatchMode.Anywhere));
        }
        if (manufacturerIDFilter.HasValue == true)
        {
            //This works when using Manufacturer.ID...
            query.Add(Expression.Eq("Manufacturer.ID", manufacturerIDFilter.Value));
        }


        //Add sort...
        switch (sort)
        {
            case "ProductName ASC":
                query.AddOrder(new Order("Name", true));
                break;
            case "ManufacturerName ASC":
                //This doesn't work when using Manufacturer.Name, but does when using Manufacturer.ID...
                query.AddOrder(new Order("Manufacturer.Name", true));
                break;
            case "ProductName DESC":
                query.AddOrder(new Order("Name", false));
                break;
            case "ManufacturerName DESC":
                query.AddOrder(new Order("Manufacturer.Name", false));
                break;
        }

        result = query.List<Model.Catalog.Product>();

        transaction.Commit();
    }

    return result;
}

1 个答案:

答案 0 :(得分:2)

我认为您需要使用以下内容。

IList<Order> orders = Session.CreateCriteria(typeof(Order))
  .AddOrder(Order.Asc("Order.Customer.LastName")
  .List<Order>();