LINQ to SQL扩展方法,用于排序和分页

时间:2009-02-12 23:12:38

标签: linq-to-sql lambda

我找到了一个处理LINQ排序和分页的扩展方法。虽然这很有效,但我试图看看是否还有其他方法可以使用它。

目前,extension method的代码如下:

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

该方法接受一个基于类型的表达式。

在我的Dealer类中,我有一个方法GetDealers,它基本上调用了这个, 即

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

从介绍方面来看,我不知道或不能访问上述表达,例如

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

唯一的方法是在我的GetDealers方法中有一个switch语句,然后转换为表达式。有没有办法绕过这个,或者这个方法好吗?

2 个答案:

答案 0 :(得分:5)

我不确定你在问什么,但我相信这是我对自己的看法。如果您想知道如何根据字符串动态排序结果,而不是正确的LINQ表达式,那么您很幸运。

Scott Guthrie在这个话题上发表了一篇很棒的article。它引用了一个Microsoft文件,它扩展了任何IQueryable对象以支持动态排序。 C# Dynamic Query Library (included in the \LinqSamples\DynamicQuery directory)。只需将页面添加到App_Code文件夹并在项目中包含“使用System.Linq.Dynamic”,您就可以使用以下语法:

myUsers = myUsers.OrderBy("LastName");

我希望这有帮助!

答案 1 :(得分:0)

如果您正在寻找适用于所有类型的扩展方法

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