【问题标题】:What's the Linq to SQL equivalent to TOP or LIMIT/OFFSET?相当于 TOP 或 LIMIT/OFFSET 的 Linq to SQL 是什么?
【发布时间】:2010-09-16 13:44:03
【问题描述】:

我该怎么做

Select top 10 Foo from MyTable

在 Linq to SQL 中?

【问题讨论】:

    标签: linq-to-sql


    【解决方案1】:

    使用Take method

    var foo = (from t in MyTable
               select t.Foo).Take(10);
    

    在 VB LINQ 中有一个 take 表达式:

    Dim foo = From t in MyTable _
              Take 10 _
              Select t.Foo
    

    来自文档:

    Take<TSource> 枚举 source 并产生元素,直到产生 count 元素或 source 不再包含元素。如果count超过source的元素个数,则返回source的所有元素。

    【讨论】:

    • C# 和 VB 之间 LINQ 的细微差别令人讨厌。为什么 C# 没有像 VB 这样的 take 表达式?这似乎是一个疏忽。而且 VB 缺少匿名 Subs 使得 lambdas 的用处大大降低。
    • 正是我想要的 +1
    • +1 正是我所需要的。而 FWIW,似乎只有 10 条记录实际上是从管道下来的。否则,我的 SELECT 会返回 巨大的 数据量,足以在痛苦的延迟后抛出 OutOfMemoryException。使用 Take(manageable-quantity),没有延迟,没有例外。
    • VB 现在也有一个 Take() 方法。我必须使用一个变量来获取金额,并且表达式不起作用,而方法起作用。
    【解决方案2】:

    这种方式对我有用:

    var noticias = from n in db.Noticias.Take(6)
                           where n.Atv == 1
                           orderby n.DatHorLan descending
                           select n;
    

    【讨论】:

    • 我刚刚编辑了你的帖子,我把葡萄牙文翻译成英文,因为这个网站只有英文(不适用于变量名,所以我没有改变这些)。跨度>
    • 对不起!我没有意识到,我以为我在巴西的 stackoverflow 中。对不起
    【解决方案3】:

    OP 实际上也提到了偏移量,例如。如果你想从 30 到 60 的项目,你会这样做:

    var foo = (From t In MyTable
           Select t.Foo).Skip(30).Take(30);
    

    对偏移使用“跳过”方法。
    使用“Take”方法进行限制。

    【讨论】:

      【解决方案4】:

      在 VB 中:

      from m in MyTable
      take 10
      select m.Foo
      

      这假设 MyTable 实现了 IQueryable。您可能必须通过 DataContext 或其他提供程序来访问它。

      它还假设 Foo 是 MyTable 中映射到属性名称的列。

      更多详情请参阅http://blogs.msdn.com/vbteam/archive/2008/01/08/converting-sql-to-linq-part-7-union-top-subqueries-bill-horst.aspx

      【讨论】:

      • 这在 C# 中不起作用,没有 take 表达式。您需要使用 Take() 方法。
      • 从技术上讲,提问者要求 Linq to SQL,因此 VB 是一个可行的假设。也就是说,ALassek,我自己就是一个 c# 人,我更喜欢你的回答。 :-)
      • 嗯,你的例子是用 C# LINQ 编写的,这就是我指出这一点的原因。
      • 2 个问题:1) 这在 VB 中运行良好。在 C# 中,你有 Take 方法。 2) take 在客户端工作,而不是在数据库中,所以如果你有很大的结果集,你最终会从数据库中得到所有的结果!
      • 欣赏这是几年前的事了,但对于刚到这里的人来说,值得注意的是,在执行“.Select()”或“.Take(x)”之前应该出现“.Take(x)”。 ToList()”,因为“.Take(x)”只有在您枚举结果之前才会包含在生成的 SQL 中。如果它出现在这之后,那么它将在结果集被枚举后完成,因此是一个普通的旧 Linq 语句!
      【解决方案5】:

      我不得不使用 Take(n) 方法,然后转换为列表,就像一个魅力:

          var listTest = (from x in table1
                           join y in table2
                           on x.field1 equals y.field1
                           orderby x.id descending
                           select new tempList()
                           {
                               field1 = y.field1,
                               active = x.active
                           }).Take(10).ToList();
      

      【讨论】:

        【解决方案6】:
        Array oList = ((from m in dc.Reviews
                                   join n in dc.Users on m.authorID equals n.userID
                                   orderby m.createdDate descending
                                   where m.foodID == _id                      
                                   select new
                                   {
                                       authorID = m.authorID,
                                       createdDate = m.createdDate,
                                       review = m.review1,
                                       author = n.username,
                                       profileImgUrl = n.profileImgUrl
                                   }).Take(2)).ToArray();
        

        【讨论】:

          【解决方案7】:

          使用Take(int n) 方法:

          var q = query.Take(10);
          

          【讨论】:

            【解决方案8】:

            take 发生在客户端还是数据库中取决于您应用 take 运算符的位置。如果在枚举查询之前应用它(即在 foreach 中使用它或将其转换为集合之前),则 take 将导致“top n”SQL 运算符被发送到数据库。如果您运行 SQL 探查器,您可以看到这一点。如果您在枚举查询后应用 take,它将发生在客户端上,因为 LINQ 必须从数据库中检索数据以便您通过它进行枚举

            【讨论】:

              【解决方案9】:

              @Janei:我在这里的第一条评论是关于你的样本;)

              我认为如果你这样做,你想取 4,然后对这 4 应用排序。

              var dados =  from d in dc.tbl_News.Take(4) 
                              orderby d.idNews descending
                              select new 
                              {
                                  d.idNews,
                                  d.titleNews,
                                  d.textNews,
                                  d.dateNews,
                                  d.imgNewsThumb
                              };
              

              不同于通过 idNews 降序然后取 4 对整个 tbl_News 进行排序

              var dados =  (from d in dc.tbl_News
                              orderby d.idNews descending
                              select new 
                              {
                                  d.idNews,
                                  d.titleNews,
                                  d.textNews,
                                  d.dateNews,
                                  d.imgNewsThumb
                              }).Take(4);
              

              不是吗?结果可能不同。

              【讨论】:

                【解决方案10】:

                从DataBase中取数据不排序与随机取数据是一样的

                【讨论】:

                • 这当然不是随机的,虽然不能保证结果是可重复的,但有很多时候你想这样做,尤其是在测试中。
                【解决方案11】:

                我喜欢这样:

                 var dados =  from d in dc.tbl_News.Take(4) 
                                orderby d.idNews descending
                
                                select new 
                                {
                                    d.idNews,
                                    d.titleNews,
                                    d.textNews,
                                    d.dateNews,
                                    d.imgNewsThumb
                                };
                

                【讨论】:

                • 这种方法的问题是,当我怀疑你真正想要的是获得前 4 个结果时,你会取 4 个然后订购它们。您需要在 orderby 之后进行取货,请参阅 Yanns 评论。
                【解决方案12】:

                这在 C# 中运行良好

                var q = from m in MyTable.Take(10)
                        select m.Foo
                

                【讨论】:

                  【解决方案13】:

                  您将使用 Take(N) 方法。

                  【讨论】:

                    猜你喜欢
                    • 2014-04-05
                    • 2011-04-24
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2011-01-27
                    相关资源
                    最近更新 更多