Asp.net mvc 实体框架分页

Asp.net mvc 实体框架分页,asp.net-mvc,webforms,entity-framework-4,Asp.net Mvc,Webforms,Entity Framework 4,我一直在寻找代码,如果我可以在EF中分页大数据,例如从1到100。。。或者更重要的是,web应用程序速度非常慢。 我这里有代码,但我还没有找到解决方案 我真的需要使页面中的数据或使数据查看速度更快 这些记录超过(15000000)条记录。 请伙计们,如果有人有任何代码或解决方案的EF分页或数据可以更快地回复我 谢谢各位 [守则] var openComplaintsAssignedToOffice = individual.Office.AssignedComplaints

我一直在寻找代码,如果我可以在EF中分页大数据,例如从1到100。。。或者更重要的是,web应用程序速度非常慢。 我这里有代码,但我还没有找到解决方案

我真的需要使页面中的数据或使数据查看速度更快 这些记录超过(15000000)条记录。 请伙计们,如果有人有任何代码或解决方案的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;

您没有明确指出要将数据分页到哪里,因此为了简单起见,我假设它在这里:

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

您没有明确指出要将数据分页到何处,因此为了简单起见,我假设它在这里:

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()
子句之前或之后,等等。根据您打算如何塑造和呈现数据,它在逻辑上属于什么位置,这实际上取决于您自己。

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

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

在处理这个问题时要考虑的一个非常重要的问题是尽可能推迟执行。像
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();
通常,您将使用和方法来处理分页数据
Skip()
将确定要“跳过”多少元素以定义页面的起点,
Take()
将确定要抓取多少元素

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

在处理这个问题时要考虑的一个非常重要的问题是尽可能推迟执行。像
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();

你只是在寻找
.Skip()
.Take()
函数吗?你问的是一个非常琐碎的问题,伴随着似乎与之无关的代码。或者,更准确地说,代码本身似乎会引起问题。您只是在寻找
.Skip()
.Take()
函数吗?您在问一个非常琐碎的问题,而代码似乎与此无关。或者,更准确地说,代码本身似乎会引起问题。我想感谢Rion的代码,如果我变成这样,它实际上是有效的。Office.AssignedComplaints.Skip(pageSize*currentPage)。Take(pageSize)我想感谢Rion的代码,如果我变成这样,它实际上是有效的。Office.AssignedComplaints.Skip(pageSize*currentPage)。Take(pageSize)