Как заказать два свойства DatetimeOffset с помощью Linq - PullRequest
1 голос
/ 08 мая 2019

У меня есть класс с именем DocumentHistory, который имеет два свойства DateTimeOffset? - CreatedOn и ModifiedOn. Я хочу иметь возможность упорядочить к в самое последнее время без необходимости указывать свойство want для просмотра вначале.

Я пытался заказать их, используя OrderByDescending Линка.

  var documentHistories = docHistory
    .OrderByDescending(c => c.CreatedOn)
    .ThenByDescending(c => c.ModifiedOn)
    .ToList();

Ответы [ 2 ]

2 голосов
/ 08 мая 2019

Вы можете попробовать реализовать IComparable в своем классе DocumentHistory.Например, у вас может быть что-то вроде этого:

class DocumentHistory : IComparable<DocumentHistory>
{
    public DateTime? CreatedOn { get; set; }
    public DateTime? ModifiedOn { get; set; }

    public int CompareTo(DocumentHistory other)
    {
        if (ReferenceEquals(this, other)) return 0;
        if (ReferenceEquals(null, other)) return 1;

        var thisMostRecentDate = Nullable.Compare(CreatedOn, ModifiedOn) > 0 ? CreatedOn : ModifiedOn;
        var otherMostRecentDate = Nullable.Compare(other.CreatedOn, other.ModifiedOn) > 0 ? other.CreatedOn : other.ModifiedOn;

        return Nullable.Compare(otherMostRecentDate, thisMostRecentDate);
    }
}

Тогда, если вы просто вызовете Sort() в своем Списке, он отсортирует их в ожидаемом порядке.

0 голосов
/ 08 мая 2019

В общем случае вы можете попробовать объединить все свойства на выбор в коллекцию (скажем, массив) и добавить Max()

var documentHistories = docHistory
  .OrderByDescending(c => new DateTimeOffset?[] {
     c.CreatedOn,  //TODO: put all the relevant properties here 
     c.ModifiedOn,
   }.Max())
  .ToList();

Если у вас есть только 2 свойства, вы можете упростить запрос до

var documentHistories = docHistory
  .OrderByDescending(c => c.CreatedOn > c.ModifiedOn ? c.CreatedOn : c.ModifiedOn)
  .ToList();
...