Asp.net mvc 3 动态asc描述排序
我试图在nhibernate中创建在后端调用期间排序的表头。单击标题时,它会发送一个字符串,指示排序依据(即“名称”、“名称描述”)并将其发送到db调用 数据库可能会变得相当大,因此我还内置了后端过滤器和分页功能,以减少检索到的数据的大小,因此orderby需要在过滤器和skip and take之前或同时进行,以避免对较小的数据进行排序。下面是QueryOver调用的一个示例:Asp.net mvc 3 动态asc描述排序,asp.net-mvc-3,nhibernate,Asp.net Mvc 3,Nhibernate,我试图在nhibernate中创建在后端调用期间排序的表头。单击标题时,它会发送一个字符串,指示排序依据(即“名称”、“名称描述”)并将其发送到db调用 数据库可能会变得相当大,因此我还内置了后端过滤器和分页功能,以减少检索到的数据的大小,因此orderby需要在过滤器和skip and take之前或同时进行,以避免对较小的数据进行排序。下面是QueryOver调用的一个示例: IList<Event> s = session.QueryOver<Event>(
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();
IList s=
session.QueryOver(()=>@eventAlias)
.Fetch(@event=>@event.FiscalYear).Eager
.JoinQueryOver(()=>@eventAlias.FiscalYear,()=>fyAlias,JoinType.InnerJoin,Restrictions.On(()=>fyAlias.Id).IsIn(_年))
.Where(()=>!@eventAlias.IsDeleted);
.OrderBy(()=>fyAlias.RefCode).Asc
.ThenBy(()=>@eventAlias.Name).Asc
.Skip(numberOfRecordsToSkip)
.获取(第页记录的编号)
.List();
如何实现这一点?实现这一点的一种方法(多种方法中的一种,因为您还可以使用一些完全类型的筛选对象等或一些查询生成器)可能类似于以下草稿: 第一和第二部分:
// 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)
...
//I.对我们的查询的引用
var query=session.QueryOver(()=>@eventAlias);
//二,。加入,筛选。。。需要什么
查询
.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;
}
//三、订货人
//假设我们有一个字符串列表(从UI客户端传递)
//这里由这两个值表示
var sortBy=新列表{“Name”,“CodeDesc”};
//首先,有一个OrderBuilder的参考
IQueryOverOrderBuilder订单=null;
//迭代列表
foreach(sortBy中的var sortProperty)
{
//使用Desc还是Asc?
var useDesc=sortProperty.EndsWith(“Desc”);
//清除属性名
var name=useDesc
?sortProperty.移除(sortProperty.长度-4,4)
:sortProperty;
//建立秩序
订单=订单==null
?query.OrderBy(Projections.Property(name))
:query.ThenBy(Projections.Property(name))
;
//使用DESC或ASC
query=useDesc?order.Desc:order.Asc;
}
最后,结果如下:
// IV. back to query... call the DB and get the result
IList<Event> s = query
.List<Event>();
//IV.返回查询。。。调用数据库并获得结果
IList s=查询
.List();
此草稿已准备好在根查询之上进行排序。您还可以对其进行扩展,以便能够将一些order语句添加到
joinQuery
(例如,如果字符串为“FiscalYear.MonthDesc”)。逻辑类似,但围绕joinQuery构建(见第一部分)问题是什么?