2010-12-13 5 views
1

meine Anwendung hat den folgenden Code eine ToSortedList Erweiterungsmethode auf jedem IEnumberable hinzuzufügen:Nhibernate 3 - LINQ Probleme

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

Im alten LINQ-Provider (oben auf NHibernate 2.1) kann ich dann sagen:

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

jedoch den neuen in-built LINQ-Anbieter in NHibernate 3 (ändern Linq oben Query) mit dieser nicht funktioniert und der folgende Fehler ausgelöst:

„festgelegte Methode ist n ot unterstützt. " - innerhalb der Initialize-Methode

Ich würde es wirklich schätzen, wenn mir jemand zeigen könnte, wie das gemacht werden könnte.

+0

können Sie die Stack-Trace für wo die Ausnahme in Nhibernate geworfen wird? ich habe eine Idee von dem, was die Ursache ist, aber ich dachte, dass es eine andere Ausnahme warf, und normalerweise sehe ich es nur w/extension-Methode innerhalb der Abfrage verwendet –

Antwort

2

Das Problem i hatte zu verwenden, dass ich vor einem SortiertNach ein Take tat, die leider eine Ausnahme mit der Veröffentlichung warf. Ich habe mein Beispiel vereinfacht und ich habe den wichtigsten Teil übersehen. Dies wurde in einem späteren Build behoben.

1

Kannst du nicht einfach verwenden:

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

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

+0

Prost für Ihre Antwort, aber mein Beispiel wurde vereinfacht. Es ist viel zu spät für mich, so etwas zu ändern, da ich es in 100er Orten machen müsste. – nfplee

+1

Sie könnten IQueryable erweitern und das gleiche Muster wie oben hinzufügen? –

+1

Möglicherweise, aber ich dachte, da IQueryable von IEnumerable erbt, würde ich Sachen allgemeiner halten, also kann ich meine Verlängerungsmethode auf irgendein IEnumerable anwenden. Das Problem ist, dass dies zuvor mit dem alten LINQ-Provider funktioniert hat, aber nicht in NHibernate 3. – nfplee

2

Im neuen Provider-Sitzung verwendet werden soll. Abfrage(), Linq ist eine Erweiterungsmethode von NHibernate.Linq.dll. Sie sollten diese DLL löschen, wenn Sie mit nh3 arbeiten.

So sollte Ihr Beispiel so etwas wie:

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

Eine Randnotiz; Sie verwenden SortDirection WebControls ffrom, mein Rat ist ListSortDirection von Component http://msdn.microsoft.com/es-es/library/system.componentmodel.listsortdirection(v=VS.80).aspx

+1

+1 für die Erwähnung der ListSortDirection. –