LINQ查询选择前五名

109*_*793 223 c# linq

我有一个LINQ查询:

var list = from t in ctn.Items
           where t.DeliverySelection == true && t.Delivery.SentForDelivery == null
           orderby t.Delivery.SubmissionDate
           select t;
Run Code Online (Sandbox Code Playgroud)

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

Gid*_*don 412

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

  • 这似乎从数据库中获取与匹配相等条件一样多的结果,并且只有在从数据库中取出它之后才应用应用程序中的take(5)限制.有没有办法从字面上"仅"获取数据库中的前5行? (6认同)
  • @JMHicks不是真的.Take(5)命令只向IQueryable添加另一个条件,在枚举之前不会执行.但是,可能有LINQ提供程序不支持Take操作. (6认同)
  • +1,但是gah,在括号中包含多行表达式然后取消引用整个批次真的会因为某些原因而对我产生影响. (5认同)
  • @JMHicks根据 https://learn.microsoft.com/en-us/dotnet/api/system.linq.enumerable.take?view=net-6.0 上的文档,此构造不会首先枚举整个集合。Quote: `Take` 是通过使用延迟执行来实现的。立即返回值是一个对象,它存储执行操作所需的所有信息。在通过直接调用 GetEnumerator 方法或使用 foreach 枚举对象之前,不会执行此方法表示的查询 (2认同)

Har*_*OTA 37

解决方案:

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

  • 至少1分钟缓慢,光荣的提及. (3认同)

小智 20

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

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


Dav*_*dRR 7

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

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

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

注意,每一种方法(Where,OrderBy,Take出现在此LINQ语句)需要一个lambda表达式作为参数.另请注意,文档Enumerable.Take以:

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


top*_*ool 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();
Run Code Online (Sandbox Code Playgroud)