LINQ-запит, щоб вибрати п'ять найкращих


234

У мене є запит LINQ:

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

Як я можу змінити цей запит, щоб вибрати лише п'ять результатів із бази даних?


Візьміть (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 рядків з бази даних?
Дж. М. Хікс

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

Цього можна також досягти, використовуючи підхід Linqda на основі Ламбди;

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починається з:

Повертає задану кількість суміжних елементів із початку послідовності.


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

0

Думаючи, ви можете почувати себе незнайомою послідовності Від-> Де-> Виберіть, як у sql-скрипті, це як Select-> From-> Where.

Але ви, можливо, не знаєте, що всередині Sql Engine він також аналізує послідовність " Від-> Де-> Вибрати ". Щоб перевірити його, ви можете спробувати простий скрипт

select id as i from table where i=3

і це не буде працювати, причина полягає в тому, що двигун буде аналізувати Де раніше, ніж Вибрати , тому він не буде знати псевдонім i in the where . Щоб зробити цю роботу, ви можете спробувати

select * from (select id as i from table) as t where i = 3
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.