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;