2009-02-12 6 views
7

nous avons trouvé une méthode d'extension qui gère le tri et la pagination pour LINQ. Bien que cela fonctionne bien, j'essaie de voir s'il y a d'autres façons de l'utiliser.LINQ à la méthode d'extension SQL pour le tri et la pagination

À l'heure actuelle, le code de la extension method est la suivante:

public static IQueryable<T> Page<T, TResult>(
    this IQueryable<T> obj, 
    int page, 
    int pageSize, 
    System.Linq.Expressions.Expression<Func<T, TResult>> keySelector, 
    bool asc, 
    out int rowsCount) 
{ 
    rowsCount = obj.Count(); 

    int innerRows = (page - 1) * pageSize; 

    if (asc) 
     return obj.OrderBy(keySelector).Skip(innerRows).Take(pageSize).AsQueryable(); 
    else 
     return obj.OrderByDescending(keySelector).Skip(innerRows).Take(pageSize).AsQueryable(); 
} 

La méthode prend dans une expression, qui est basé sur le type.

Dans ma classe de revendeur, j'ai une méthode GetDealers, qui appelle essentiellement ce, dire

db.User.Page(1, 2, p => p.User.UserProperty.Name, true, out rowCount) 

Du côté de la présentation des choses bien, je ne sais pas ou ne peut accéder à l'expression comme ci-dessus, par exemple

ListView1.DataSource = users.GetDealers("SortColumn", pageNo, pageSize, out rowCount, bool asc); 
ListView1.DataBind(); 

La seule façon est d'avoir une instruction switch dans ma méthode GetDealers qui ensuite se convertir à l'expression. Existe-t-il un moyen de contourner ceci, ou cette méthode est-elle correcte?

Répondre

5

Je ne suis pas sûr de ce que vous demandez, mais je crois qu'il est quelque chose que j'ai regardé en moi-même. Si vous souhaitez savoir trier dynamiquement vos résultats en fonction d'une chaîne plutôt que d'une expression LINQ correcte, vous avez de la chance.

Scott Guthrie a publié un grand article sur ce sujet très. Il fait référence à un fichier Microsoft qui étend tout objet IQueryable pour prendre en charge le tri dynamique. C# Dynamic Query Library (included in the \LinqSamples\DynamicQuery directory). Il suffit d'ajouter la page à votre dossier App_Code et inclure « Utilisation System.Linq.Dynamic » dans votre projet et vous serez en mesure d'utiliser la syntaxe suivante:

myUsers = myUsers.OrderBy("LastName"); 

J'espère que cela aide!

0

Si vous êtes à la recherche de méthode d'extension pour fonctionner sur tous les types

public static class SortingAndPagingHelper 
{ 
    /// <summary> 
    /// Returns the list of items of type on which method called 
    /// </summary> 
    /// <typeparam name="TSource">This helper can be invoked on IEnumerable type.</typeparam> 
    /// <param name="source">instance on which this helper is invoked.</param> 
    /// <param name="sortingModal">Page no</param> 
    /// <returns>List of items after query being executed on</returns> 
    public static IEnumerable<TSource> SortingAndPaging<TSource>(this IEnumerable<TSource> source, SortingAndPagingInfo sortingModal) 
    { 
     // Gets the coloumn name that sorting to be done o`enter code here`n 
     PropertyInfo propertyInfo = source.GetType().GetGenericArguments()[0].GetProperty(sortingModal.SortColumnName); 

     // sorts by ascending if sort criteria is Ascending otherwise sorts descending 
     return sortingModal.SortOrder == "Ascending" ? source.OrderByDescending(x => propertyInfo.GetValue(x, null)).Skip(sortingModal.PageSelected * sortingModal.PageSize).Take(sortingModal.PageSize) 
          : source.OrderBy(x => propertyInfo.GetValue(x, null)).Skip(sortingModal.PageSelected * sortingModal.PageSize).Take(sortingModal.PageSize); 
    } 
} 

DbContext dbContext = new DbContext(); dbContext.rainingSessions.Where(x => x.RegistrationDeadline > DateTime.Now) .SortingAndPaging(sortAndPagingInfo).ToList()