Получить максимальное значение даты-времени, которое можно обнулить

#c#

#c#

Вопрос:

Я пытаюсь получить максимальную конечную дату объекта списка, используя group by с идентификатором и ProductID. Но я получаю Nullable object must have a value." Я пробовал значение HAS, но получаю ошибку во время выполнения? Я делаю это неправильно?

 static void Main(string[] args)
{
  try
  {
    List<Data> ListOfData = new List<Data>();
    ListOfData.Add(new Data() { Id = 1, ProductId = 5, EndDate = null });
    ListOfData.Add(new Data() { Id = 2, ProductId = 6, EndDate = null });
    ListOfData.Add(new Data() { Id = 3, ProductId = 4, EndDate = DateTime.Now });

    //var ListofUniqueData = ListOfData.GroupBy(r => new { r.Id, r.ProductId })
    //                                                .Select(g => g.OrderByDescending(r => r.EndDate.HasValue ? r.EndDate.Value : null ).First())
    //                                                .Select(i => new { i.Id, i.ProductId, i.EndDate.HasValue ? i.EndDate.Value : null })
    //                                                .ToList();

    var ListofUniqueData = ListOfData.GroupBy(r => new { r.Id, r.ProductId })
                                     .Select(g => g.OrderByDescending(r => r.EndDate.Value)
                                                   .First())
                                     .Select(i => new { i.Id, i.ProductId, i.EndDate.Value })
                                     .ToList();
  }
  catch ( Exception ex )
  {
    ex.ToString();
  }

}

class Data
{
  public int Id { get; set; }
  public int ProductId { get; set; }
  public DateTime? EndDate { get; set; }
}
  

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

1. Используется для null: new DateTime(), которое равно 1/1/01.

2. Не уверен в своих намерениях полностью, но попробуйте добавить предложение where: .Where(x => x.EndData.HasValue) , я думаю, это зависит от того, нужны ли вам элементы null EndDate или нет.

3. Да, я хочу включить нулевые значения

Ответ №1:

Вы можете использовать GetValueOrDefault , чтобы получить значение по умолчанию для типа, если оно не назначено:

 var ListofUniqueData = ListOfData.GroupBy(r => new {r.Id, r.ProductId})
    .Select(g => g.OrderByDescending(r => r.EndDate.GetValueOrDefault()).First())
    .Select(i => new {i.Id, i.ProductId, i.EndDate.GetValueOrDefault()})
    .ToList();
  

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

1. Вы получаете ту же ошибку при использовании GetValueOrDefault

2. Вам не нужен оператор объединения null ?? . GetValueOrDefault() принимает параметр, который является значением по умолчанию, если он не существует

3. На самом деле GetValueOrDefault возвращает DateTime.MinValue , если экземпляр этого не делает HasValue . Не уверен, что здесь происходит…