几天前我问了一个问题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获得我需要的东西,我该如何实现所需的功能? 这是非常重要,我需要从基础中获得不同的结果,而不是在客户端上使其明显。
答案 0 :(得分:0)
如果你想通过c.Name获得订单,那么你必须使用NHibernate DTO并为c.Name添加投影。
因为按列排序必须出现在查询的选择项中。
http://www.junasoftware.com/blog/nhibernate-setresulttransformer-and-dto.aspx