如何在IQueryable中使用Skip()和Take()

时间:2011-09-17 09:30:50

标签: c# asp.net user-controls

我有一个包含转发器的用户控件,它的数据是使用IEnumerable对象设置的,该对象包含代码中从查询返回的数据。转发器具有分页功能,并为每个页面显示自定义的记录数。

每次用户单击下一个按钮以查看转发器中的下一页记录时,我不想加载所有数据。如何使其成为IQueryable并使用Skip()和Take()仅显示该页面所需的记录?

我有以下代码:

//Code that assigns query to repeater data source
DataSet = QueryGoesHere.ToArray(); // returns IEnumerable
repeater.DataSource = DataSet;
repeater.DataBind();

//Code that creates PagedDataSource - how can I update this to make it display only the records that are needed for the currently displayed page?

            objPds = new PagedDataSource();
            objPds.DataSource = DataSource
            objPds.AllowPaging = true;
            objPds.PageSize = 5;
            objPds.CurrentPageIndex = CurrentPage;
            lblCurrentPage.Text = "Page: " + (CurrentPage + 1).ToString() + " of " + objPds.PageCount.ToString();

3 个答案:

答案 0 :(得分:5)

如果我说得对,你想要使用自己的实现,而不是加载所有数据,然后使用PagedDataSource吗?

如果是这样,你必须确保QueryGoesHere是一个支持它的Queryable(Linq2Sql或EF)。然后你必须得到这样的日期计数

var count = QueryGoesHere.Count();

并获取要显示的数据部分:

var skip = (curPageNumber - 1)*itemsPerPage;
var display = Math.Min(count - skip, itemsPerPage);

然后使用

var displayedItems = QueryGoesHere.Skip(skip).Take(display).ToArray();

这应该可以解决问题。

答案 1 :(得分:1)

PagedList和相关扩展程序对您有所帮助。请参阅:http://wekeroad.com/2007/12/10/aspnet-mvc-pagedlistt

答案 2 :(得分:1)

    public static Dictionary<string, string> SampleDataList(int startIndex, int pageSize)
    {
        Dictionary<string, string> sampleTable = new Dictionary<string, string>();
        var query = from p in TemporaryData()
                    .Take(pageSize)
                    .Skip(startIndex)
                    select new
                    {
                        FirstColumn = p.Key,
                        SecondColumn = p.Value
                    };
        foreach (var row in query)
        {
            sampleTable.Add(row.FirstColumn, row.SecondColumn);
        }
        return sampleTable;
    }

以下链接将帮助您了解如何使用转发器分页

http://cmsnsoftware.blogspot.com/2011/07/how-to-use-custom-pagination.html