Nhibernate 3 - LINQ问题

时间:2010-12-13 11:53:53

标签: linq nhibernate linq-to-nhibernate

我的应用程序有以下代码在任何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方法中

如果有人能告诉我如何做到这一点,我真的很感激。

3 个答案:

答案 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