Страницы

Поиск по вопросам

суббота, 6 июля 2019 г.

Список клиентов с датой их самого первого заказа выдаёт InvalidOperationException

Есть классы моделей
public class Customer { public string CustomerID { get; set; } public string CompanyName { get; set; } public string Address { get; set; } public string City { get; set; } public string Region { get; set; } public string PostalCode { get; set; } public string Country { get; set; } public string Phone { get; set; } public string Fax { get; set; } public Order[] Orders { get; set; } }
public class Order { public int OrderID { get; set; } public DateTime OrderDate { get; set; } public decimal Total { get; set; } }
Необходимо получить список клиентов с датой их первого заказа(заказ с самой ранней датой для каждого клиента)
Мой запрос выглядит так:
var customers = dataSource.Customers.Select(c => c.Orders.Min(o => o.OrderDate));
Во время исполнения получаю исключениеSystem.InvalidOperationException: Последовательность не содержит элементов
Объясните пожалуйста в чем ошибка и как сделать корректный запрос. Спасибо!


Ответ

Как верно заметили в соседнем ответе — эта ошибка возникает когда у клиента нет заказов.
Решение зависит от того, что вы хотите получить, если у клиента нет заказов. Возвращать default(DateTime), скорее всего, в этом случае плохое решение.
Если вам не нужны те клиенты, которые не делали заказов, то их нужно предварительно отсеять:
// Странный запрос — он же возвращает коллекцию DateTime, а не Customer? var customers = dataSource.Customers .Where(c => c.Orders.Any()) .Select(c => c.Orders.Min(o => o.OrderDate));
Либо, если вам нужны и те клиенты, которые не делали заказов, возможно, лучше будет возвращать для них вместо даты null
var customers = dataSource.Customers .Select(c => c.Orders.Min(o => (DateTime?)o.OrderDate)); // Да, для Nullable-типов Min не падает на пустой коллекции, а возвращает null: // https://referencesource.microsoft.com/#system.core/system/linq/Enumerable.cs,1679
Ну и, в конце концов, выбрать минимальный элемент из коллекции дешевле, чем полностью ее отсортировать, не стоит забывать об этом.

Комментариев нет:

Отправить комментарий