2010-12-13 39 views
1

ma demande a le code suivant pour ajouter une méthode d'extension ToSortedList sur tout IEnumberable:Nhibernate 3 - LINQ Questions

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

Dans l'ancien fournisseur LINQ (au-dessus de NHibernate 2.1) Je pourrais alors dire:

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

Cependant, l'utilisation du nouveau cela ne fonctionne pas construit fournisseur LINQ dans NHibernate 3 (changer LINQ to requête ci-dessus) et l'erreur suivante est générée:

« méthode spécifiée est n ot supporté. " - dans la méthode Initialize

Je serais vraiment reconnaissant si quelqu'un pouvait me montrer comment cela pourrait être fait.

+0

pouvez-vous mettre la trace de la pile d'où l'exception est levée dans nhibernate? J'ai une idée de ce que la cause est, mais je pensais qu'il a jeté une exception différente, et généralement je ne vois que w/méthode d'extension utilisée à l'intérieur de la requête –

Répondre

2

Le problème est que j'avais je faisais prendre avant un OrderBy qui a jeté malheureusement une exception avec la sortie. J'ai simplifié mon exemple et je suppose que j'ai raté la partie la plus importante. Cela a été résolu dans une version ultérieure.

1

ne pouvez-vous utiliser simplement:

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

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

+0

Bravo pour votre réponse, mais mon exemple a été simplifié. Il est beaucoup trop tard pour que je puisse faire un changement comme celui-ci car je devrais le faire dans des centaines d'endroits. – nfplee

+1

Vous pouvez étendre IQueryable et ajouter le même modèle que vous avez ci-dessus? –

+1

Peut-être mais je me suis dit puisque IQueryable hérite de IEnumerable je garderais les choses plus génériques afin que je puisse appliquer ma méthode d'extension à tout IEnumerable. Le problème est ceci travaillé avant avec l'ancien fournisseur LINQ mais pas dans NHibernate 3. – nfplee

2

Dans le nouveau fournisseur, vous devez utiliser session. Query(), Linq est une méthode d'extension de NHibernate.Linq.dll. Vous devriez supprimer cette DLL lorsque vous travaillez avec nh3.

Ainsi, votre exemple devrait être quelque chose comme:

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

Une note de côté; vous utilisez SortDirection FDans WebControls, mon conseil est d'utiliser ListSortDirection de ComponentModel http://msdn.microsoft.com/es-es/library/system.componentmodel.listsortdirection(v=VS.80).aspx

+1

+1 pour mentionner le ListSortDirection. –