2009-02-12 12 views
7

Ho trovato un metodo di estensione che gestisce l'ordinamento e il paging per LINQ. Mentre questo funziona bene, sto cercando di vedere se ci sono altri modi in cui posso usarlo.LINQ al metodo di estensione SQL per l'ordinamento e il paging

Attualmente, il codice per il extension method è il seguente:

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

Il metodo prende in un'espressione, che si basa fuori del tipo.

Nella mia classe Dealer, Ho un metodo GetDealers, che chiede in sostanza questo, cioè

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

Dal lato presentazione delle cose, però, non so o posso accedere l'espressione di cui sopra, ad esempio,

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

L'unico modo è quello di avere un'istruzione switch nel mio metodo GetDealers che avrebbe poi convertire l'espressione. C'è un modo per aggirare questo, o questo metodo è OK?

risposta

5

Non sono esattamente sicuro di quello che stai chiedendo, ma credo che sia qualcosa che ho guardato dentro me stesso. Se desideri sapere come ordinare i risultati in modo dinamico in base a una stringa, anziché un'espressione LINQ corretta, sei fortunato.

Scott Guthrie ha pubblicato un ottimo article proprio su questo argomento. Fa riferimento a un file Microsoft che estende qualsiasi oggetto IQueryable per supportare l'ordinamento dinamico. C# Dynamic Query Library (included in the \LinqSamples\DynamicQuery directory). Basta aggiungere la pagina per la cartella App_Code e comprendono "Uso System.Linq.Dynamic" nel progetto e si sarà in grado di utilizzare la seguente sintassi:

myUsers = myUsers.OrderBy("LastName"); 

Spero che questo aiuta!

0

Se siete alla ricerca di metodo di estensione per lavorare su tutti i tipi

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

Problemi correlati