按顺序从数据库中检索对象列表

时间:2014-03-02 00:42:46

标签: c# asp.net-mvc linq entity-framework

我正在寻找一种顺序获取项目列表的方法,这意味着每次调用都会按顺序检索一组数据库值。

好的,那不是很清楚,所以让我告诉你。

假设我有200个具有日期属性的对象条目,每个条目都从2月初到今天输入。

我的第一个电话将检索一组20个最新的条目,然后下一个电话将检索条目21-40,然后下一个电话41-60,依此类推,只要有数据可以获得。

我正在使用C#/ Entity Framework并且熟悉Linq和LinqKit,但这对我来说是一个新的挑战,并且我会接受任何建议!

编辑好的,根据评论,我的例子还不够。

所以让我们说200而不是200我有200万条参赛作品,而且还有更多参赛作品。但是,正如我所提到的,我只是想加载前20个,然后是每个电话接下来的20个,但我不知道知道用户拨打电话的次数,这就是我无法“调整”Take(20)次呼叫的原因,因为这是动态的。

EDIT2

以下是一些代码示例,可以指导您和我的工作:)

List<Book> listBooks = (from b in DbContext.Books
                                    orderby b.DateAdded
                                    select b).Take(count).ToList();

请注意,这段代码并不完美,因为它总会返回添加的20本最新书。但是在第二次通话时我想要下一个20,然后在第三个电话上看41-60本书,依此类推。

EDIT3

经过一些研究,我发现了一些可能符合我需求的东西:

Paging with LINQ for objects

但是,我需要解决一些问题,找出如何使这项工作。

2 个答案:

答案 0 :(得分:2)

如果它们只有200,我建议你只用一个查询来获取数据库的所有数据。

然后存储在例如列表中,然后执行类似的操作。

list = list.OrderByDescending(x => x.Name).ToList();

然后获得前20个元素:

var result = list.Take(20);

获得21-40:

var result = list.Skip(20).Take(20);

这种方式如果您想要更多或更少的内容,您只需要在变量中转换20;)

我希望这会有所帮助

答案 1 :(得分:1)

正如所提到的,使用skip()take()以及变量来实现您的目标:

var numberOfBooksToGrab = 20;
var numberOfTimesYouHaveGrabbedBooks = 0;

List<Book> listBooks = (from b in DbContext.Books
                                    orderby b.DateAdded
                                    select b).Skip(numberOfBooksToGrab * numberOfTimesYouHaveGrabbedBooks)
                                             .Take(numberOfBooksToGrab)
                                             .ToList();

每次拨打电话时,您显然需要更新numberOfTimesYouHaveGrabbedBooks变量,但这对您来说应该很容易(并且取决于项目的其余部分是如何构建的)。