LINQ查询以选择前五名


234

我有一个LINQ查询:

var list = from t in ctn.Items
           where t.DeliverySelection == true && t.Delivery.SentForDelivery == null
           orderby t.Delivery.SubmissionDate
           select t;

如何修改此查询以从数据库中仅选择五个结果?


拍摄(how_many_you_wish)
snr

Answers:


437
var list = (from t in ctn.Items
           where t.DeliverySelection == true && t.Delivery.SentForDelivery == null
           orderby t.Delivery.SubmissionDate
           select t).Take(5);

5
+1,但是,由于某种原因,将多行表达式用括号括起来,然后取消对整个引用的引用,确实让我很生气。
2014年

6
这似乎要从数据库中获取与相等条件相等的结果一样多的结果,并且只有从数据库中获取了结果之后,才在应用程序中应用take(5)限制。有没有办法从字面上take仅从数据库的前5行?
JM Hicks,2014年

6
@JMHicks并非如此。Take(5)命令仅向IQueryable添加了另一个条件,该条件直到您枚举后才会执行。但是,可能有不支持Take操作的LINQ提供程序。
布鲁诺·布兰特

1
@JMHicks-这不是linq的工作方式... linq很懒。
霍根

39

解决方案:

var list = (from t in ctn.Items
           where t.DeliverySelection == true && t.Delivery.SentForDelivery == null
           orderby t.Delivery.SubmissionDate
           select t).Take(5);

19

也可以使用基于Lambda的Linq方法来实现。

var list = ctn.Items
.Where(t=> t.DeliverySelection == true && t.Delivery.SentForDelivery == null)
.OrderBy(t => t.Delivery.SubmissionDate)
.Take(5);

8

[提供比@Ajni提供的答案更具描述性的答案。]

这也可以使用LINQ 流利语法实现:

var list = ctn.Items
    .Where(t=> t.DeliverySelection == true && t.Delivery.SentForDelivery == null)
    .OrderBy(t => t.Delivery.SubmissionDate)
    .Take(5);

注意,每一种方法(WhereOrderByTake)出现在此LINQ语句采用一个lambda表达式作为参数。另请注意,的文档Enumerable.Take始于:

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


5

Additional information

有时有必要将模型绑定到视图模型中并给出类型转换错误。在这种情况下,您应该使用ToList()方法。

var list = (from t in ctn.Items
       where t.DeliverySelection == true && t.Delivery.SentForDelivery == null
       orderby t.Delivery.SubmissionDate
       select t).Take(5).ToList();

0

只是以为您可能对序列From-> Where-> Select不熟悉,就像在sql脚本中一样,就像Select-> From-> Where。

但是您可能不知道在Sql Engine中,它也按' From-> Where-> Select ' 的顺序进行解析,要对其进行验证,可以尝试一个简单的脚本

select id as i from table where i=3

而且它不起作用,原因是引擎会解析 Select之前 Where,因此它将在where中不知道别名i 。要进行此工作,您可以尝试

select * from (select id as i from table) as t where i = 3
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.