【问题标题】:LINQ query to select top fiveLINQ 查询以选择前五名
【发布时间】:2011-02-02 09:55:56
【问题描述】:

我有一个 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)

标签: c# linq


【解决方案1】:
var list = (from t in ctn.Items
           where t.DeliverySelection == true && t.Delivery.SentForDelivery == null
           orderby t.Delivery.SubmissionDate
           select t).Take(5);

【讨论】:

  • +1,但是 gah,将多行表达式包装在括号中,然后取消引用整个代码,出于某种原因确实让我感到厌烦。
  • 这似乎从数据库中获取与相等条件匹配的尽可能多的结果,并且只有在从数据库中获取它们之后,它才会在应用程序中应用 take(5) 限制。有没有办法只从数据库中直接 take 前 5 行?
  • @JMHicks 不是真的。 Take(5) 命令只是将另一个条件添加到 IQueryable,直到您枚举它才会执行。但是,可能存在不支持 Take 操作的 LINQ 提供程序。
  • @JMHicks -- 这不是 linq 的工作方式...... linq 是懒惰的。
  • @HosseinSedghian ,我假设你的意思是写它的 Lambda 表达方式:ctn.Items.Where(t=> t.DeliverySelection == true && t.Delivery.SentForDelivery == null).OrderBy(t => t.Delivery.SubmissionDate).Take(5)
【解决方案2】:

解决办法:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      这也可以使用 LINQ fluent syntax 来实现:

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

      请注意,此 LINQ 语句中出现的每个方法(WhereOrderByTake)都将lambda expression 作为参数。另请注意,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();
        

        【讨论】:

          【解决方案6】:

          只是想你可能对From->Where->Select这个序列感到陌生,就像在sql脚本中一样,它就像Select->From->Where。

          但是你可能不知道,在Sql Engine里面,也是按照sequence的顺序解析的 '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
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2023-03-18
            • 2016-06-15
            • 1970-01-01
            • 2018-05-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多