Есть классы моделей
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
Ну и, в конце концов, выбрать минимальный элемент из коллекции дешевле, чем полностью ее отсортировать, не стоит забывать об этом.
Комментариев нет:
Отправить комментарий