Я бы оптимизировал код, НЕ используя LINQ для этого:
var parameter = _db.Parameter[0]; // you may need to handle that there's at least 1 item.
for (int i = 1; i < _db.Parameter.Count; i++)
{
var param = _db.Parameter[i];
if (param.EndDate > givenDate)
{ // param is good
if (parameter.EndDate == null || parameter.EndDate > param.EndDate)
parameter = param; // replace parameter with param
}
else if (parameter.EndDate != null && parameter.EndDate < givenDate)
{ // parameter precedes given date, replace it!
parameter = param;
}
}
Это будет повторять ваш список только один раз, в отличие от других предоставленных решений.
Если вы ДОЛЖЕН использовать LINQ и хотите выполнить итерацию один раз, может быть, вы можете использовать нижеприведенное, которое будет возвращать динамическое значение, поэтому вам необходимо преобразовать его обратно в Parameter
. Он работает путем замены NULL
на DateTime.MaxValue
, чтобы при вводе OrderBy
записи, которые были NULL
, были упорядочены внизу.
var param = _db.Parameter
.Select(x => new
{
ID = x.ID,
EndDate = (x.EndDate.HasValue) ? x.EndDate : DateTime.MaxValue,
Value = x.Value
})
.OrderBy(x => x.EndDate)
.FirstOrDefault();
var parameter = new Parameter()
{
ID = param.ID,
EndDate = (param.EndDate == DateTime.MaxValue) ? null : param.EndDate,
Value = param.Value
};