实体框架分页

时间:2016-05-04 14:19:03

标签: asp.net-mvc webforms entity-framework-4

我一直在寻找代码,如果我可以在EF中分页大数据,例如从1到100 ......或更多,Web应用程序真的很慢。 我有代码,但我还没找到解决方案。

我真的需要在页面中制作数据或更快地使数据视图 记录超过(1,5000,000)条记录。 请大家,如果有人有EF分页的任何代码或解决方案,或者数据可以更快回复我。

谢谢你们,

[代码]

var openComplaintsAssignedToOffice = individual.Office.AssignedComplaints
                                                      .ToArray()
                                                      .Where(n => n.Individuals.Any(e => e.Employed))
                                                      .ToArray() ; 

if (!complaintModel.ShowClosedComplaints)
{
    openComplaintsAssignedToOffice = openComplaintsAssignedToOffice.Where(c => c.CurrentStatus != ComplaintStatus.Closed)
                                                                   .ToArray();
}

complaintModel.OpenComplaintsAssignedToMyOffice = openComplaintsAssignedToOffice.OrderByDescending(c => c.UpdatedDateTime)
                                                                                .ToArray();
complaintModel.OpenComplaintsAssignedToMyOffice = openComplaintsAssignedToOffice.OrderByDescending(c => c.UpdatedDateTime)
                                                                                .ToArray();
return complaintModel;

2 个答案:

答案 0 :(得分:1)

您没有具体说明您要将数据分页的位置,因此为了简单起见,我将假设它在这里:

individual.Office.AssignedComplaints

(但是,作为旁注,你似乎对于在这里和那里投掷.ToArray()非常傲慢。通过强制系统加载,了解这可能彻底影响性能在对那些最好对数据源本身执行的记录执行过滤之前,将许多记录到内存中。)

您可以使用.Skip().Take()功能有效地分页结果。例如,假设您有以下值:

var pageSize = 10;
var currentPage = 3;  // 0-indexed, of course

考虑到这些,你会期望看到30-39的记录,对吗?因此,您可以使用这些值来分页数据:

individual.Office.AssignedComplaints.Skip(pageSize * currentPage).Take(pageSize)

这将导致跳过前30个记录(0-29)并取下10个记录,忽略其余记录。有效地返回总结果集的“第3页”。

此分页可以应用于整个表达式树中可以过滤结果集的任何位置。在排序之前或之后,在.Where()子句之前或之后,等等。根据您打算如何塑造和呈现数据,它在逻辑上属于您。

答案 1 :(得分:1)

通常,您将使用Skip()Take()方法来处理分页数据。 Skip()将确定要“跳过”以定义页面起点的元素数量,Take()将确定要抓取的元素数量。

// This will skip the first 10 records and take the next 20
var page = data.Skip(10).Take(20);

考虑Deferred Execution

处理此问题时需要考虑的一件非常重要的事情是,您希望尽可能延迟执行。像ToList()ToArray()这样的方法实际上会将您的值存储在您希望避免的内存中,尤其是对于大型数据集。

如果你可以避免调用这些方法,你将确保查询本身只执行一次(因此只返回一页记录而不是整个数据集,然后在内存中分页)。 / p>

您可能会重构代码以使用分页,如下所示:

// Define your page size and initial page
var page = 0;
var pageSize = 20;
// Get any open complaints
var openComplaints = individual.Office.AssignedComplaints.Where(n => n.Individuals.Any(e => e.Employed));
// Determine if complaints should be shown
if (!complaintModel.ShowClosedComplaints)
{
     openComplaints = openComplaints.Where(c => c.CurrentStatus != ComplaintStatus.Closed);                                                            
}
// Finally order and page your data
return openComplaints.OrderByDescending(c => c.UpdatedDateTime)
                     .Skip(page * pageSize)
                     .Take(pageSize)
                     .ToArray();