我的应用程序有以下代码在任何IEnumberable上添加ToSortedList扩展方法:
public class SortedList<T, TResult> : List<T> {
public SortedList(IEnumerable<T> source, Expression<Func<T, TResult>> sortBy, SortDirection sortDirection) {
Initialize(source is IQueryable<T> ? source as IQueryable<T> : source.AsQueryable(), sortBy, sortDirection);
}
protected void Initialize(IQueryable<T> source, Expression<Func<T, TResult>> sortBy, System.Web.UI.WebControls.SortDirection sortDirection) {
AddRange(sortDirection == SortDirection.Ascending ? source.OrderBy(sortBy) : source.OrderByDescending(sortBy));
}
}
public static class SortingExtensions {
public static SortedList<T, TResult> ToSortedList<T, TResult>(this IEnumerable<T> source, Expression<Func<T, TResult>> sortBy, SortDirection sortDirection) {
return new SortedList<T, TResult>(source, sortBy, sortDirection);
}
}
在旧的LINQ提供程序(在NHibernate 2.1之上),我可以说:
session.Linq<Article>().ToSortedList(a => a.Date, SortDirection.Ascending);
然而,在NHibernate 3中使用新的内置LINQ提供程序(将Linq更改为上面的查询),这不起作用,并抛出以下错误:
“不支持指定的方法。” - 在Initialize方法中
如果有人能告诉我如何做到这一点,我真的很感激。
答案 0 :(得分:2)
在新的提供程序中,您应该使用session。查询(),Linq是NHibernate.Linq.dll的扩展方法。使用nh3时应删除此dll。
所以你的例子应该是这样的:
session.Query<Article>().ToSortedList(a => a.Date, SortDirection.Ascending);
旁注;你正在使用WebControls的SortDirection,我的建议是使用componentmodel中的ListSortDirection http://msdn.microsoft.com/es-es/library/system.componentmodel.listsortdirection(v=VS.80).aspx
答案 1 :(得分:2)
我遇到的麻烦是我在OrderBy之前做了一个Take,不幸的是在发布时抛出异常。我简化了我的例子,猜测我错过了最重要的部分。这已在以后的版本中得到解决。
答案 2 :(得分:1)
你不能只使用:
var articles =
session.QueryOver<Article>()
.OrderBy(a => a.Date).Asc
.List();
请参阅:http://nhibernate.info/blog/2009/12/17/queryover-in-nh-3-0.html