我正在尝试创建在nhibernate的后端调用期间排序的表头。单击标题时,它会发送一个字符串,指示要排序的内容(即"Name", "NameDesc"
)并将其发送到数据库调用。
db可以变得非常大,所以我还有后端过滤器和分页内置减少检索数据的大小,因此orderby需要在过滤器之前或同时发生,并跳过并采取以避免排序较小的数据。以下是QueryOver调用的示例:
IList<Event> s =
session.QueryOver<Event>(() => @eventAlias)
.Fetch(@event => @event.FiscalYear).Eager
.JoinQueryOver(() => @eventAlias.FiscalYear, () => fyAlias, JoinType.InnerJoin, Restrictions.On(() => fyAlias.Id).IsIn(_years))
.Where(() => !@eventAlias.IsDeleted);
.OrderBy(() => fyAlias.RefCode).Asc
.ThenBy(() => @eventAlias.Name).Asc
.Skip(numberOfRecordsToSkip)
.Take(numberOfRecordsInPage)
.List();
我该如何做到这一点?
答案 0 :(得分:1)
如何实现这个(其中一个,因为你也可以使用一些完全类型的过滤器对象等或一些查询构建器)的一种方法可能就像这个草案:
第一部分和第二部分:
// I. a reference to our query
var query = session.QueryOver<Event>(() => @eventAlias);
// II. join, filter... whatever needed
query
.Fetch(@event => @event.FiscalYear).Eager
var joinQuery = query
.JoinQueryOver(...)
.Where(() => !@eventAlias.IsDeleted)
...
第三部分:
// III. Order BY
// Assume we have a list of strings (passed from a UI client)
// here represented by these two values
var sortBy = new List<string> {"Name", "CodeDesc"};
// first, have a reference for the OrderBuilder
IQueryOverOrderBuilder<Event, Event> order = null;
// iterate the list
foreach (var sortProperty in sortBy)
{
// use Desc or Asc?
var useDesc = sortProperty.EndsWith("Desc");
// Clean the property name
var name = useDesc
? sortProperty.Remove(sortProperty.Length - 4, 4)
: sortProperty;
// Build the ORDER
order = order == null
? query.OrderBy(Projections.Property(name))
: query.ThenBy(Projections.Property(name))
;
// use DESC or ASC
query = useDesc ? order.Desc : order.Asc;
}
最后结果:
// IV. back to query... call the DB and get the result
IList<Event> s = query
.List<Event>();
此草稿已准备好在根查询之上进行排序。您还可以扩展它以便能够向joinQuery
添加一些订单语句(例如,如果字符串是“FiscalYear.MonthDesc”)。逻辑类似,但是围绕joinQuery构建(参见第一部分)