C# 使用实体框架选择一个范围

C# 使用实体框架选择一个范围,c#,entity-framework,linq-to-entities,C#,Entity Framework,Linq To Entities,我遇到了一个问题,就是如何最大化具有页面的listview的性能 我希望实体框架执行select语句,但只返回结果的一个范围(范围=listview一页的项目) 我在谷歌上搜索过,但没有找到任何关于这个的结果。我只发现我可以做一个.ToList().GetRange(开始索引,结束索引),但是所有的项目都会被加载到内存中,这就是我想要避免的 有人能告诉我这是否可以做到吗?(我不想使用存储过程或视图或类似的东西,因为我们的listview必须是可重用的…) 谢谢 您应该能够使用.Take(x).T

我遇到了一个问题,就是如何最大化具有页面的listview的性能

我希望实体框架执行select语句,但只返回结果的一个范围(范围=listview一页的项目)

我在谷歌上搜索过,但没有找到任何关于这个的结果。我只发现我可以做一个.ToList().GetRange(开始索引,结束索引),但是所有的项目都会被加载到内存中,这就是我想要避免的

有人能告诉我这是否可以做到吗?(我不想使用存储过程或视图或类似的东西,因为我们的listview必须是可重用的…)


谢谢

您应该能够使用
.Take(x).ToList()


编辑:很抱歉,请尝试
.Skip(startPosition).Take(numberOfItems).ToList()

如果您没有使用延迟加载,请确保在应用筛选器时在加载之前使用Query(),以避免在应用筛选器之前加载整个集合:

context.Entry(blog) 
    .Collection(b => b.Posts) 
    .Query() 
    .Skip(startPosition)
    .Take(numberOfItems)
    .Load()
    .ToList(); 
使用查询方法时,通常最好关闭导航属性的延迟加载。这是因为否则整个集合可能会被延迟加载自动加载 执行筛选查询之前或之后的机制


有关更多详细信息:

Skip(50)。在有序查询中使用(10)将从第50个开始为您提供10个项目。我认为命名
startPosition
有点混乱,因为它不是开始,而是在开始之前。它可能被命名为
skipRows
@ninbit这是一个古老的答案!它应该是零索引位置,即
跳过(1)。Take(1)
将跳过索引为0的项目,并返回索引为1的项目。但是是的,
skipRows
更适合
Skip
方法。