什么是Linq to SQL相当于TOP或LIMIT/OFFSET?

Her*_*ill 192 linq-to-sql

我该怎么做呢

Select top 10 Foo from MyTable
Run Code Online (Sandbox Code Playgroud)

在Linq to SQL?

Ada*_*sek 248

使用Take方法:

var foo = (from t in MyTable
           select t.Foo).Take(10);
Run Code Online (Sandbox Code Playgroud)

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

Dim foo = From t in MyTable _
          Take 10 _
          Select t.Foo
Run Code Online (Sandbox Code Playgroud)

从文档:

Take<TSource>枚举source并生成元素,直到count元素被生成或不source包含更多元素.如果count超过source元素数,source则返回所有元素.

  • LINQ在C#和VB之间的微小差异令人讨厌.为什么C#没有像VB这样的take表达式?这似乎是一种疏忽.VB缺乏匿名Subs使得lambdas的用处更少. (13认同)

Dav*_*ert 143

在VB中:

from m in MyTable
take 10
select m.Foo
Run Code Online (Sandbox Code Playgroud)

这假设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()方法. (126认同)
  • 从技术上讲,提问者要求Linq使用SQL,因此VB是一个可行的假设.那就是说,ALassek,我自己就是那个人,而且更喜欢你的回答.:-) (10认同)
  • 感谢这已经有几年了,但对于那些刚到这里的人来说,值得注意的是".Take(x)"应该出现在你执行".Select()"或".ToList()"之前,作为" .Take(x)"只有在枚举结果之前才会包含在生成的SQL中.如果它出现在此之后,那么一旦结果集被枚举就会完成它,因此是一个普通的Linq语句! (8认同)
  • 好吧,你的例子是用C#LINQ编写的,这就是为什么我指出了这一点. (3认同)
  • 2个问题:1)这在VB中工作正常.在C#中你有Take方法.2)take在客户端工作,而不是在db中工作,所以如果你有大的结果集,你最终会从db获取所有这些到客户端! (3认同)

小智 33

使用Take(int n)方法:

var q = query.Take(10);
Run Code Online (Sandbox Code Playgroud)


Inc*_*c33 22

OP实际上也提到了偏移,所以对于ex.如果你想把物品从30到60,你会这样做:

var foo = (From t In MyTable
       Select t.Foo).Skip(30).Take(30);
Run Code Online (Sandbox Code Playgroud)

使用"跳过"方法进行偏移.
使用"Take"方法进行限制.


小智 13

@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
                };
Run Code Online (Sandbox Code Playgroud)

不同于通过idNews降序整数tbl_News然后取4

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

不?结果可能会有所不同.


小智 5

这适用于C#

var q = from m in MyTable.Take(10)
        select m.Foo
Run Code Online (Sandbox Code Playgroud)


use*_*368 5

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