Linq to sql Linq到SQL的等价物是TOP还是LIMIT/OFFSET?

Linq to sql Linq到SQL的等价物是TOP还是LIMIT/OFFSET?,linq-to-sql,Linq To Sql,我该怎么做 Select top 10 Foo from MyTable 在VB中的Linq to SQL?中: from m in MyTable take 10 select m.Foo 这假设MyTable实现IQueryable。您可能必须通过DataContext或其他提供程序访问它 它还假设Foo是MyTable中映射到属性名的列 有关更多详细信息,请参阅。您将使用take方法。使用: 在VB中,LINQ有一个take表达式: Dim foo = From t in MyTabl

我该怎么做

Select top 10 Foo from MyTable
在VB中的Linq to SQL?

中:

from m in MyTable
take 10
select m.Foo
这假设MyTable实现IQueryable。您可能必须通过DataContext或其他提供程序访问它

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


有关更多详细信息,请参阅。

您将使用take方法。

使用:

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

Dim foo = From t in MyTable _
          Take 10 _
          Select t.Foo
从文件中:

Take枚举源并生成元素,直到生成计数元素或源不包含更多元素为止。如果计数超过源中的元素数,则返回源中的所有元素

使用taken方法:

这在C语言中运行良好

var q = from m in MyTable.Take(10)
        select m.Foo
我喜欢这样:

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

不进行排序而获取数据库数据与随机获取相同

@Janei:我在这里的第一个评论是关于您的样本

我想如果你喜欢这个,你需要取4,然后对这4进行排序

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


没有?结果可能不同。

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

我必须使用take方法,然后转换为list,工作起来很有魅力:

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

OP实际上也提到了偏移量,因此对于ex.如果您想获得30到60之间的项目,您可以:

var foo = (From t In MyTable
       Select t.Foo).Skip(30).Take(30);
对偏移量使用跳过方法。
使用Take方法进行限制。

这样对我有效:

var noticias = from n in db.Noticias.Take(6)
                       where n.Atv == 1
                       orderby n.DatHorLan descending
                       select n;
对于限制1,请使用方法FirstOrDefault或First

范例


变量y=从q中的x选择x.FirstOrDefault

这在C中不起作用,没有take表达式。您需要使用Take方法。从技术上讲,提问者要求使用Linq to SQL,因此VB是一个可行的假设。也就是说,阿拉塞克,我自己也是一个c类人,我更喜欢你的答案-好的,你们的例子是用C语言写的,这就是为什么我要指出。2个问题:1这在VB中很好用。在C中,您有Take方法。2 take在客户机中工作,而不是在db中,因此,如果您有较大的结果集,您最终会从db将所有结果都发送到客户机!请注意,这已经有几年的历史了,但是对于刚刚来到这里的人来说,值得注意的是.Takex应该在您执行.Select或.ToList之前出现,因为.Takex只有在您枚举结果之前才会包含在生成的SQL中。如果它出现在这之后,那么它将在枚举结果集之后执行,因此它是一个普通的旧Linq语句!C和VB在LINQ方面的细微差别令人讨厌。为什么C没有像VB那样的take表达式?这似乎是一个疏忽。VB缺少匿名Subs,这使得lambdas的用处大大降低。正是我想要的+1+1,也正是我需要的。而FWIW,似乎只有这十张唱片真正进入了管道。否则,我的SELECT将返回大量数据,足以在痛苦的延迟后抛出OutOfMemoryException。有了Take可管理的数量,没有延迟,没有例外。VB现在也有了Take方法。我必须使用一个变量来表示要获取的数量,而表达式不起作用,而方法却起作用。这种方法的问题是,当我怀疑您真正想要的是获得前4个结果时,您将获取4个,然后对它们进行排序。您需要在orderby之后进行拍摄,请参阅Yanns评论。我刚刚编辑了您的帖子,我将葡萄牙语文本翻译成了英语,因为此网站仅为英语,不适用于变量名称,这就是为什么我没有更改这些。抱歉!我没有意识到,我以为我在巴西。抱歉,这当然不是随机的,虽然结果不能保证是可重复的,但是有很多次你想这样做,特别是在测试中。
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();
    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();
var foo = (From t In MyTable
       Select t.Foo).Skip(30).Take(30);
var noticias = from n in db.Noticias.Take(6)
                       where n.Atv == 1
                       orderby n.DatHorLan descending
                       select n;