#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)
, я думаю, это зависит от того, нужны ли вам элементы nullEndDate
или нет.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
. Не уверен, что здесь происходит…