2009-11-16 4 views
1

У меня есть метод, который загружает коллекцию продуктов. Каждый заказ имеет дочерний объект, называемый «Производитель» (у меня есть отношение «много-к-одному», установленное в моем файле сопоставления). Я хотел бы сортировать коллекцию продуктов по продуктам. Производитель. Имя. Как я могу это сделать?Сортировка по дочернему объекту в NHibernate

отображение продукта:

<?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; 
} 

ответ

2

Я думаю, что вам нужно будет использовать что-то вроде следующего.

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

Отлично! Я все еще вроде noobie и не понимаю, что вы могли бы это сделать. Большое спасибо! –

+0

Извините, я, возможно, говорил слишком рано. Я мог использовать определенные поля в своих дочерних объектах, но не во всех полях. –

+0

Обновлено исходное сообщение для включения сопоставлений и образцов кода. –

Смежные вопросы