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


Answers:


146

在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


127
这在C#中不起作用,没有take表达式。您需要使用Take()方法。
亚当·拉瑟克

10
从技术上讲,发问者要求使用Linq to SQL,因此VB是可行的假设。就是说,ALassek,我是我自己的家伙,更喜欢您的回答。:-)
David Alpert

3
好吧,你的例子是用C#LINQ编写的,这就是我指出这一点的原因。
亚当·拉瑟克

3
2个问题:1)在VB中可以正常工作。在C#中,您具有Take方法。2)take在客户端而不是在db中起作用,因此,如果您有很大的结果集,则最终会将所有内容从db获取到客户端!
由纪

8
意识到这已经有好几年了,但是对于刚来到这里的人来说,值得注意的是,在执行“ .Select()”或“ .ToList()”之前,应先出现“ .Take(x)”,例如“ .Take(x)“仅在枚举结果之前包含在生成的SQL中。如果在此之后出现,则将在枚举结果集后执行,因此它是普通的旧Linq语句!
Bertie 2012年

248

使用Take方法

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超过中的元素数sourcesource则返回的所有元素。


13
C#和VB之间的LINQ的微小差异令人讨厌。为什么C#没有像VB这样的take表达式?这似乎是一个疏忽。而且VB缺少匿名Subs使得Lambda的使用效率大大降低。
亚当·拉瑟克

我一直在寻找+1
jasonco

1
+1正是我所需要的。FWIW似乎实际上只有十个记录。否则,我的SELECT将返回大量数据,足以在痛苦的延迟后引发OutOfMemoryException。使用Take(manage-quantity),没有延迟,也不例外。
鲍勃·考夫曼

VB现在也具有Take()方法。我必须使用一个变量来表示要使用的数量,而该方法却不能使用该表达式。
戴夫·约翰逊


24

OP实际上也提到了偏移量,因此例如。如果您希望将商品的数量从30增至60,则可以执行以下操作:

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

使用“跳过”方法进行补偿。
使用“ 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
                };

与按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);

不行吗 结果可能有所不同。


5

这在C#中效果很好

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

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
                };

7
这种方法的问题是,当我怀疑您真正想要得到前4个结果时,您将需要4个然后订购它们。您需要在订购后进行提取,请参阅Yanns评论。
罗素·特洛伊韦斯特


3

收票发生在客户端还是在数据库中取决于您在何处应用收票运算符。如果在枚举查询之前(即,在foreach中使用它或将其转换为集合之前)应用查询,则take会导致“ top n”个SQL运算符被发送到数据库。如果运行SQL事件探查器,则可以看到此消息。如果您在枚举查询后应用汇整,它将在客户端发生,因为LINQ必须从数据库检索数据才能通过它进行枚举


2

在不排序的情况下获取数据库的数据与随机获取相同


尽管不能保证结果是可重复的,但肯定不是随机的,但是您有很多时间想要这样做,尤其是在测试中。
Auspex

2
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();

0

我不得不使用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();

0

这样,它为我工作:

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

我刚刚编辑了您的帖子,将葡萄牙语文本翻译成英语,因为该站点仅是英语(不适用于变量名,这就是为什么我没有更改它们的原因)。
waka

不好意思!我没有意识到,我以为自己在巴西的stackoverflow中。抱歉
Gladson Reis

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.