Nhibernate 3 - Проблемы LINQ - PullRequest
       7

Nhibernate 3 - Проблемы LINQ

1 голос
/ 13 декабря 2010

мое приложение имеет следующий код для добавления метода расширения ToSortedList в любой IEnumberable:

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);

Однако, используя новый встроенный поставщик LINQ в NHibernate 3 (измените Linq на Query выше), это не работает, и выдается следующая ошибка:

"Указанный метод не поддерживается."- в методе Initialize

Буду очень признателен, если кто-нибудь покажет мне, как это можно сделать.

Ответы [ 3 ]

2 голосов
/ 15 декабря 2010

В новом провайдере вы должны использовать сессию. Запрос (), Linq - это метод расширения из NHibernate.Linq.dll. Вы должны удалить эту DLL при работе с nh3.

Итак, ваш пример должен выглядеть примерно так:

session.Query<Article>().ToSortedList(a => a.Date, SortDirection.Ascending);

примечание; вы используете SortDirection из WebControls, мой совет - использовать ListSortDirection из componentmodel http://msdn.microsoft.com/es-es/library/system.componentmodel.listsortdirection(v=VS.80).aspx

2 голосов
/ 17 декабря 2010

Проблема в том, что я делал Take перед OrderBy, который, к сожалению, вызвал исключение при выпуске. Я упростил свой пример и, думаю, пропустил самую важную часть. Это было решено в более поздней сборке.

1 голос
/ 13 декабря 2010

Разве вы не можете просто использовать:

var articles =
    session.QueryOver<Article>()
        .OrderBy(a => a.Date).Asc
        .List();

См .: http://nhibernate.info/blog/2009/12/17/queryover-in-nh-3-0.html

...