Linq to SQL等价于TOP或LIMIT/OFFSET?

我怎么做呢

Select top 10 Foo from MyTable

在Linq到SQL?

183370 次浏览

在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

您可以使用Take(N)方法。

使用采取的方法:

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中的所有元素。

使用Take(int n)方法:

var q = query.Take(10);

这在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个应用排序。

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降序排序整个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);

没有?结果可能不同。

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

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

我必须使用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();

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

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

使用“Skip”方法进行偏移

.

.

.

这种方法对我很有效:

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