LINQ - 如何在LINQ / C#中使用单个linq查询进行分页

时间:2017-05-12 15:50:46

标签: c# linq pagination frameworks entity

我需要使用单个查询进行分页,实际上我的代码是。

public object Paginate(int Page) // Page = 1
 {
     object result = new object();

     const int paginateResults = 10; //showed rows

     int TotalItems = (from x in Members select new { x.ID }).Count(); // = 100
     //this last line is for show: total items 100

     int itemsStart = (Page-1) * paginateResults; // = 1
     int itemsEnd = Page * paginateResults;// = 10
     //this last 2 lines is for show: showing results from 1 - 10

     int PaginatePages = TotalItems / paginateResults; //10 pages [1][2][3]...[9] (for the buttons)       

     List<EOMEMBER> currentPageItems = (from x in Members select x)
         .Skip(itemsStart).Take(paginateResults).ToList(); // results from 1 - 10       



     return result;
 }

实际上我对数据库调用了五次,如何使用一个或两个查询(最好是单个查询)并使此方法适用于任何对象(动态)

1 个答案:

答案 0 :(得分:0)

您可以为IEnumerable或IQueryable声明一个新的扩展名。请参阅Msdn文档中的详细信息。例如;

using System;
using System.Collections.Generic;
using System.Linq;

namespace Demo.Extensions
{
    public static class IEnumerableExtensions
    {
        public static IEnumerable<T> Page<T>(this IEnumerable<T> queryable, int page, int pageSize)
        {
            return queryable.Skip((page - 1) * pageSize).Take(pageSize);
        }
    }
}

使用示例:

using System;
using System.Linq;
using Demo.Extensions;

namespace Demo
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            var items = Enumerable.Range(1, 100).Page(2, 10);
            foreach (var item in items)
            {
                Console.WriteLine(item);
            }
            Console.ReadKey();
        }
    }
}
相关问题