Что такое Linq to SQL, эквивалентный TOP или LIMIT / OFFSET? - PullRequest
189 голосов
/ 10 октября 2008

Как мне это сделать

Select top 10 Foo from MyTable

в Linq to SQL?

Ответы [ 14 ]

246 голосов
/ 10 октября 2008

Используйте метод 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 превышает количество элементов в source, возвращаются все элементы source.

143 голосов
/ 10 октября 2008

В 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.

33 голосов
/ 10 октября 2008

Используйте метод Take(int n):

var q = query.Take(10);
18 голосов
/ 16 октября 2015

ОП на самом деле упомянул смещение, так что, например, если вы хотите получить предметы от 30 до 60, вы должны сделать:

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

Используйте метод «Пропустить» для смещения.
Используйте метод «Take» для лимита.

13 голосов
/ 12 августа 2010

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

Отличается от сортировки целых tbl_News по idNews по убыванию, а затем по 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);

нет? результаты могут быть разными.

5 голосов
/ 07 января 2010

Это хорошо работает в C #

var q = from m in MyTable.Take(10)
        select m.Foo
4 голосов
/ 26 января 2010

Мне так нравится:

 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
                };
3 голосов
/ 22 ноября 2011

Зависит ли получение на клиенте или в БД, зависит от того, где вы применяете оператор получения. Если вы примените его перед тем, как перечислить запрос (то есть перед тем, как использовать его в foreach или преобразовать его в коллекцию), результат приведет к тому, что оператор SQL "top n" будет отправлен в базу данных. Вы можете увидеть это, если вы запустите SQL Profiler. Если вы примените дубль после перечисления запроса, это произойдет на клиенте, поскольку LINQ придется получить данные из базы данных, чтобы вы могли перечислять через них

3 голосов
/ 10 октября 2008

Вы бы использовали метод Take (N).

2 голосов
/ 15 марта 2013
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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...