Nhibernate按另一个类的属性排序

时间:2012-01-03 08:17:20

标签: c# .net nhibernate

几天前我问了一个问题My previous question。所以我的问题是如何通过属性和不同的对象列表对属性进行排序。那时我试图通过使用QueryOver来实现这一点,但现在我正在使用Criterea API。我再次有相同的记录。这是我的criterea

var lst = 
    Session.CreateCriteria<News>().CreateAlias("Category", "c").AddOrder(Order.Asc("c.Name")).
      SetFirstResult(pageSize * pageNumber).SetMaxResults(pageSize).List<News>();

如果我想添加Distinct投影,我什么也得不到。只是例外Unable to perform find[SQL: SQL not available]

var lst =
    Session.CreateCriteria<News>().SetProjection(Projections.Distinct(Projections.Id())).CreateAlias("Category", "c").AddOrder(Order.Asc("c.Name")).
      SetFirstResult(pageSize * pageNumber).SetMaxResults(pageSize).List<News>();

public class News
{
    public virtual int Id { get; protected set; }
    public virtual string Topic { get; set; }
    public virtual Category Category { get; set; }
}

public class Category
{
     public virtual int Id { get; protected set; }
     public virtual string Name { get; set; }
     public virtual ISet<News> News { get; set; }
}

和映射

 <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="News" namespace="NewsManagement.Models">
     <class name="News" table="News">
        <id name="Id">
             <generator class="native" />
         </id>
         <property name="Date" not-null="true" />
         <many-to-one name="Category" fetch="join" column="CategoryId" class="Category, NHibernateManyToOne" not-null="true"/>
     </class>
 </hibernate-mapping>

 <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="News" namespace="NewsManagement.Models">
     <class name="Category" table="Categories">
         <id name="Id" column="Id">
             <generator class="native" />
         </id>
         <set name="News" fetch="join" cascade="all-delete-orphan">
             <key column="CategoryId" />
             <one-to-many class="News, NHibernateOneToMany" /> 
         </set>
     </class>
 </hibernate-mapping>

如果无法通过criterea API获得我需要的东西,我该如何实现所需的功能? 这是非常重要,我需要从基础中获得不同的结果,而不是在客户端上使其明显。

1 个答案:

答案 0 :(得分:0)

如果你想通过c.Name获得订单,那么你必须使用NHibernate DTO并为c.Name添加投影。

因为按列排序必须出现在查询的选择项中。

http://www.junasoftware.com/blog/nhibernate-setresulttransformer-and-dto.aspx

http://elegantcode.com/2007/10/30/nhibernate-projections/