限制从Linq返回列表中的结果数


76

我正在使用Linq / EF4.1从数据库中提取一些结果,并希望将结果限制为(X)个最新结果。其中X是用户设置的数字。

有没有办法做到这一点?

我目前正在将它们传递回来,List好像这将有助于限制结果集。虽然我可以通过循环直到X来限制它,但我只是假设不传递多余的数据。

万一它是相关的...从SQL Server数据库运行的C#MVC3项目。


4
您要linq“ take(100)”吗?
daryal 2012年

Answers:


146

使用Take功能

int numberOfrecords=10; // read from user
listOfItems.OrderByDescending(x => x.CreatedDate).Take(numberOfrecords)

假设listOfItems是您的实体对象的列表,并且CreatedDate是一个具有创建日期的值的字段(此处用于通过降序获取最新商品来进行订购)。

Take()函数从序列的开头返回指定数量的连续元素。

http://msdn.microsoft.com/en-us/library/bb503062.aspx


1
“最近的结果”-您的答案未解决。
先生2012年

@TA先生:啊!我错过了那部分。现在更新。感谢您指出。
Shyju 2012年

1
虽然我实际上并不需要最新部分的帮助(我对这个问题的措辞很差),但是我需要的是!谢谢!
Jared 2012年

1
一旦哑巴的等待选择答案的计时器超时,我就会选择您的答案...再次感谢
Jared 2012年

@Shyju nope不允许我说答案需要进行编辑。奇怪的。
先生2012年

30
results = results.OrderByDescending(x=>x.Date).Take(10);

OrderByDescending将按日期/时间属性(或您要用来获取最新的w / e逻辑)对项目进行排序,而Take则将限制为前x个项目(由于排序,第一个是最新的)。

编辑:要返回一些不在第一行开始的行,请使用Skip()

results = results.OrderByDescending(x=>x.Date).Skip(50).Take(10);

1
是否可以从某些索引开始获取结果?例如,一百个结果-从索引50开始,从50-60取10个结果?
FrenkyB

2
@FrenkyB请查看答案-我已对其进行更新以解决您的后续问题。
TA先生

18

Take()在转换为列表之前,请使用。这样,EF可以优化它创建的查询,并仅返回您需要的数据。


1
请您详细说明一下。也许举个例子?
WM

3
@WM首先使用Take将允许EF在SQL查询中直接执行分页。如果您先执行ToList,则所有结果将从SQL中撤回,然后分页将在内存中完成。
D'Arcy Rittich

@RedFilter是唯一解决我的问题的人。我有一套31000件商品……要拿走整个清单似乎很浪费,所以我可以从清单中拉出前10名。但是,我不介意看到一个示例:)
Joshua K
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.