Продолжить с моего комментария ....
First
/ FirstOrDefault
всегда следует указывать в предложении OrderBy, если вам не важно, какой из них вы получите.
Заказ в целом - это проблема отображения и бизнес-логики. Сущности - это представление данных.
В тех случаях, когда вы хотите отобразить данные по порядку, вам следует рассмотреть возможность составления моделей представления для отображаемых данных, а затем использовать .Select()
с соответствующими дочерними элементами в соответствующем порядке. Например, если я хочу выбрать счет и перечислить его статусы в порядке их добавления. (предполагается порядком идентификатора автоинкремента)
var invoice = _context.Invoices.OrderBy(x => x.Id)
.Select(x => new InvoiceViewModel
{
Id = x.Id,
// ... Fields the view needs to know about
InvoiceStatuses = x.InvoiceStatuses.OrderBy(s => s.Id)
.Select(s => s.StatusText)
.ToList()
}).FirstOrDefault();
Таким образом, что-то вроде этого использовало бы Invoice OrderBy, чтобы найти первый применимый Счет-фактуру (по порядку идентификаторов), а затем выбрать интересующие нас поля в модели представления. Для статусов счетов-фактур он упорядочивает их по их идентификатору и выбирает StatusText, чтобы обеспечить просмотр списка статусов в виде строк. В качестве альтернативы вы можете выбрать InvoiceStatusViewModel для возврата текста состояния, идентификатора состояния и т. Д. В зависимости от того, что вы хотите просмотреть.
В качестве альтернативы, если вы выбираете данные, которые будут использоваться на месте для некоторой бизнес-логики, вам не нужно объявлять классы модели представления, просто используйте анонимные типы:
var invoice = _context.Invoices.OrderBy(x => x.Id)
.Select(x => new
{
x.Id,
// ... Fields the view needs to know about
InvoiceStatuses = x.InvoiceStatuses.OrderBy(s => s.Id)
.Select(s => new
{
s.Id,
s.StatusText
})
.ToList()
}).FirstOrDefault();
Это дает вам данные, которые вам могут потребоваться, по порядку, но в качестве анонимных типов вы не можете вернуть эти данные вне области действия функции, например в представление.
Техника использования .Select()
для уменьшения результатов помогает привести к более эффективным запросам, поскольку вы можете использовать все формы агрегатных методов, так что вместо того, чтобы возвращать все и затем писать логику для итерации, вы можете использовать Max
, Min
, Sum
, Any
и т. Д. Для создания более эффективных запросов, которые выполняются быстрее и возвращают меньше данных по сети.