2016-05-04 173 views
0

我一直在寻找代码,如果我可以分页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; 
+0

你只是寻找'.Skip()'和'。取()'功能? – David

+0

你正在提出一个非常微不足道的问题,并附带代码,这些代码似乎并不相关。或者,更确切地说,代码似乎会导致问题本身。 –

+0

http://sqlperformance.com/2015/01/t-sql-queries/pagination-with-offset-fetch – ErikEJ

回答

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()子句之前或之后,等等。根据您打算如何塑造和呈现数据,它在逻辑上属于您。

+0

谢谢大卫,你的代码运行良好。 –

1

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

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

考虑Deferred Execution

一个非常重要的事情时要考虑处理这是您要尽可能长的时间推迟执行。诸如ToList()ToArray()等方法实际上会将您的值存储在内存中,这是您想要避免的,特别是对于大型数据集。

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

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

// 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(); 
+0

我想感谢你的代码Rion,它实际上是工作,如果我改变了这样的 individual.Office.AssignedComplaints.Skip(pageSize * currentPage).Take(pageSize) –