【问题标题】:LINQ - How paginate with single linq query in LINQ/C#LINQ - 如何在 LINQ/C# 中使用单个 linq 查询进行分页
【发布时间】:2017-10-12 00:22:06
【问题描述】:

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

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

实际上我对数据库调用了五次,我怎样才能用一个或两个查询(最好是一个查询)来做到这一点,并使这个方法适用于任何对象(动态)

【问题讨论】:

  • 五次?我在代码中只看到两个数据库查询。

标签: c# linq pagination frameworks entity


【解决方案1】:

您可以为 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();
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-21
    • 1970-01-01
    • 2012-01-04
    相关资源
    最近更新 更多