2009-02-12 24 views
7

He encontrado un método de extensión que maneja la clasificación y paginación para LINQ. Si bien esto funciona bien, estoy tratando de ver si hay otras formas en que puedo usar esto.Método de extensión LINQ to SQL para ordenar y paginar

En la actualidad, el código para el extension method es como sigue:

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

El método toma en una expresión, que está basada en el tipo.

En mi clase de distribuidor, que tiene un método GetDealers, que pide esencialmente esto, decir

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

Desde el lado de la presentación de las cosas, sin embargo, no sé o puedo tener acceso a la expresión que el anterior, por ejemplo,

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

La única manera es tener una sentencia switch en mi método GetDealers que luego convertir a la expresión. ¿Hay alguna manera de eludir esto o es correcto este método?

Respuesta

5

No estoy exactamente seguro de lo que estás preguntando, pero creo que es algo que he investigado por mi cuenta. Si desea saber cómo ordenar dinámicamente los resultados en función de una cadena, en lugar de una expresión LINQ adecuada, entonces está de suerte.

Scott Guthrie publicó un gran article sobre ese mismo tema. Hace referencia a un archivo de Microsoft que amplía cualquier objeto IQueryable para admitir la ordenación dinámica. C# Dynamic Query Library (included in the \LinqSamples\DynamicQuery directory). Sólo tiene que añadir la página a la carpeta App_Code e incluyen "Utilización System.Linq.Dynamic" en su proyecto y usted será capaz de utilizar la siguiente sintaxis:

myUsers = myUsers.OrderBy("LastName"); 

espero que esto ayude!

0

si usted está buscando para el método de extensión para trabajar en todo tipo

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