LINQ-запрос для выбора пяти лучших

234

У меня есть запрос LINQ:

var list = from t in ctn.Items
           where t.DeliverySelection == true && t.Delivery.SentForDelivery == null
           orderby t.Delivery.SubmissionDate
           select t;

Как я могу изменить этот запрос, чтобы выбрать только пять результатов из базы данных?

109221793
источник
Возьмите (how_many_you_wish)
ОСШ

Ответы:

437
var list = (from t in ctn.Items
           where t.DeliverySelection == true && t.Delivery.SentForDelivery == null
           orderby t.Delivery.SubmissionDate
           select t).Take(5);
Гидон
источник
5
+1, но, га, завершение многострочных выражений в скобках, а затем разыменование всей партии действительно почему-то меня радует.
Доктор Джонс
6
Похоже, что для этого требуется столько результатов из базы данных, сколько соответствует условиям равенства, и только после того, как они взяты из базы данных, применяется ограничение take (5) в приложении. Есть ли способ буквально takeтолько первые 5 строк из базы данных?
JM Hicks
6
@JMHicks не совсем. Команда Take (5) только добавляет еще одно условие в IQueryable, которое не будет выполняться, пока вы его не перечислите. Однако могут быть поставщики LINQ, которые не поддерживают операцию Take.
Бруно Брант
1
@JMHicks - это не тот способ, которым работает linq ... linq ленив.
Хоган
39

Решение:

var list = (from t in ctn.Items
           where t.DeliverySelection == true && t.Delivery.SentForDelivery == null
           orderby t.Delivery.SubmissionDate
           select t).Take(5);
Гарольд Сота
источник
19

Этого также можно добиться, используя подход Linq на основе лямбды;

var list = ctn.Items
.Where(t=> t.DeliverySelection == true && t.Delivery.SentForDelivery == null)
.OrderBy(t => t.Delivery.SubmissionDate)
.Take(5);
Анжи
источник
8

[Предлагает несколько более описательный ответ, чем ответ, предоставленный @Ajni .]

Этого также можно добиться, используя свободный синтаксис LINQ :

var list = ctn.Items
    .Where(t=> t.DeliverySelection == true && t.Delivery.SentForDelivery == null)
    .OrderBy(t => t.Delivery.SubmissionDate)
    .Take(5);

Обратите внимание , что каждый метод ( Where, OrderBy, Take), встречающейся в этом заявлении LINQ принимает лямбда - выражение в качестве аргумента. Также обратите внимание, что документация для Enumerable.Takeначинается с:

Возвращает указанное количество смежных элементов от начала последовательности.

DavidRR
источник
5

Additional information

Иногда необходимо связать модель в представление модели и выдать ошибку преобразования типа . В этой ситуации вы должны использовать ToList()метод.

var list = (from t in ctn.Items
       where t.DeliverySelection == true && t.Delivery.SentForDelivery == null
       orderby t.Delivery.SubmissionDate
       select t).Take(5).ToList();
topcool
источник
0

Просто думая, что вы можете быть незнакомы с последовательностью From-> Where-> Select, как в сценарии SQL, это похоже на Select-> From-> Where.

Но вы можете не знать, что внутри Sql Engine он также разбирается в последовательности « From-> Where-> Select ». Чтобы проверить это, вы можете попробовать простой скрипт

select id as i from table where i=3

и он не будет работать, причина в том, что движок будет анализировать Where перед Select , поэтому он не будет знать псевдоним i в where . Чтобы сделать эту работу, вы можете попробовать

select * from (select id as i from table) as t where i = 3
maoyang
источник