2010-12-13 2 views
1

мое приложение имеет следующий код, чтобы добавить метод расширения ToSortedList на любом IEnumberable:Nhibernate 3 - LINQ Проблемы

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 создать запрос выше) это не работает, и выбрасывается следующее сообщение об ошибке:

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

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

+0

Вы можете поместить трассировку стека, где исключение выбрасывается из nhibernate? У меня есть представление о причине, но я подумал, что это забросило другое исключение, и обычно я вижу только метод w/extension, используемый внутри запроса. –

ответ

2

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

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

+0

Приветствия за ваш ответ, но мой пример был упрощен. Мне слишком поздно делать подобные изменения, так как мне придется делать это в 100-х местах. – nfplee

+1

Вы можете расширить IQueryable и добавить тот же шаблон, что и выше? –

+1

Возможно, но я понял, что, поскольку IQueryable наследует от IEnumerable, я бы сохранил вещи более общие, поэтому я могу применить свой метод расширения к любому IEnumerable. Проблема в том, что это работало раньше со старым поставщиком LINQ, но не в NHibernate 3. – nfplee

2

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

Так что ваш пример должен быть что-то вроде:

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

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

+1

+1 для упоминания ListSortDirection. –