动态asc desc排序

时间:2013-12-03 17:16:42

标签: asp.net-mvc-3 nhibernate

我正在尝试创建在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();

我该如何做到这一点?

1 个答案:

答案 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构建(参见第一部分)