使用Entity Framework在ListView中进行分页

3

我正在使用 Entity Framework 实现 Listview 的分页功能,但在点击下一页/上一页按钮后传递 startindexmaxrows 时遇到了困难。

这是我的代码:

private  List<WorkItem> Data(int startindex, int maxrows)
{            
       return (from x in ss.WorkItem
                    select x).OrderBy(p => p.WorkItemID).Skip(startindex).Take(maxrows).ToList();

}

protected void lvWorkItems_PagePropertiesChanging(object sender, PagePropertiesChangingEventArgs e)
{
        this.DataPager1.SetPageProperties(e.StartRowIndex, e.MaximumRows, false);
        lvWorkItems.DataSource = Data(e.StartRowIndex,e.MaximumRows);

        lvWorkItems.DataBind();
}

我有一个问题,就是当我点击下一页/上一页按钮时,如何传递startindexmaxrows参数。请帮忙。

2个回答

3
请看一下这个it扩展方法:
 public static IQueryable<T> MyPage<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();
   if (asc)
    {
       return obj.OrderBy(keySelector).Skip(page * pageSize).Take(pageSize);
    }
   else
   {
       return obj.OrderByDescending(keySelector).Skip(page * pageSize).Take(pageSize);
   }        
}

嗨,阿里。在这个方法中,用户如何获取最后一页?如果用户想要跳转到最后一页,我该如何计算输入参数?为了获得更多信息,我需要知道总页数。当您知道用户正在查看最后一页时怎么办?在这种情况下,用户不应该能够请求下一页。 - Ardalan Shahgholi
这里有一些注释:ListView 控件(asp)没有分页和 PageIndex 事件,这个人问了这个问题,没有关于你的想法的任何东西,但如果你在静态变量中保留当前页面索引,并且最终用户单击下一页或最后一页按钮时,您可以轻松处理它并再次调用我的方法。此外,如果您需要在页面中调用最后一页,您应该收集所选项的总数,并在单击 LastPageButton 时计算所需页面(TotalCount / PageSize)= 页面,然后调用我的方法。谢谢,伙计... - Harry Sarshogh
谢谢您的回复,Ali。 - Ardalan Shahgholi

1
这正是我的问题所在。 但是通过更改业务输出类方法的结构,我的问题得到了解决。 当然,在这种方式中,您需要有数据输出和行数。 不要忘记与同一页布局相关的问题, 数据必须从数据库中提取。 我的类被设计来执行以下操作。
using System.Collections.Generic;

using System.Linq;

using Andish.CSS.Common.Enum;

using AutoMapper;

using system.linq.dynamic;


namespace Andish.CSS.Common.Result.Implementation

{

   public static class PagingResult

    {

        public static PageResult<K> ToPageResult<T, K>(this IQueryable<T> queryable, int rowCount,
            int pageNumber, string sortField, DynamicLinqSortFieldKind 

dynamicLinqSortFieldKind)

        {

var allQueryRow = queryable.ToList<T>().Count();

            var skipLen = (pageNumber - 1) * rowCount;


            string orderKind = "";

            orderKind = dynamicLinqSortFieldKind == DynamicLinqSortFieldKind.Ascending ? " Asc" : " Desc";

 PageResult<K> pageResult = new PageResult<K>

                                           {

                                               PageNumber = pageNumber,

                                               RowCount = rowCount,

                                               Result = Mapper.Map<IList<K>>(queryable.OrderBy(sortField + orderKind)
                                                                             .Skip(skipLen).Take(rowCount).ToList<T>()),
                                               ResultRowCount = allQueryRow,

                                               PageCount = allQueryRow % rowCount == 0 ? allQueryRow / rowCount : (allQueryRow / rowCount) + 1

                                           };

            return pageResult;


        }

 }



}

create this enum

public enum DynamicLinqSortFieldKind

    {

        Ascending = 0,

        Descending = 1

    }

要使用这个扩展方法,按照以下方式操作,并且我从ExecutiveUnit类中得到了一个结果,我想将这个类映射到另一个类ExecutiveUnitModel。我使用automapper nuget。

var xresult = result.ToPageResult<ExecutiveUnit, ExecutiveUnitModel>(RowNumbers, pageNumber, "Code", DynamicLinqSortFieldKind.Ascending);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接