Подтвердить что ты не робот

Что эквивалент Linq to SQL для TOP или LIMIT/OFFSET?

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

Select top 10 Foo from MyTable

в Linq to SQL?

4b9b3361

Ответ 1

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

Ответ 2

Используйте метод 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.

Ответ 3

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

var q = query.Take(10);

Ответ 4

Фактически OP также упоминает о смещении, поэтому, например, для ex. если вы хотите получить предметы от 30 до 60, вы бы сделали:

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

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

Мне нравится следующее:

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

Ответ 8

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

Ответ 9

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

Ответ 10

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

Ответ 11

Взятие данных базы данных без сортировки совпадает с случайным взятием

Ответ 12

Мне пришлось использовать метод 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();

Ответ 13

Таким образом, это сработало для меня:

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

Ответ 14

Для limit 1 используйте методы FirstOrDefault() или First().

пример

var y = (from x in q select x).FirstOrDefault();