Упорядочение по двум полям даты, какое из них является более поздним - PullRequest
0 голосов
/ 10 марта 2011

Я хочу, чтобы мои объекты были упорядочены по самой поздней дате, либо по дате обновления, либо по дате создания, в зависимости от того, какой из них более поздний.Проблема с моим кодом ниже состоит в том, что объекты, которые не были обновлены (имеют нулевое значение), отображаются внизу.

public IQueryable<MyObject> GetMyObjects()
{
    return from obj in _db.MyObjects
           orderby obj.UpdatedDate descending, obj.CreatedDate descending
           select obj;
}

Даже если объект не имеет обновленной даты, он все равно должен появиться раньше другихобъекты, которые имеют обновленную дату, если даты обновления этих объектов меньше, чем дата создания этого объекта.Как мне этого добиться?По сути, я хочу сделать заказ по самой поздней дате и использовать либо обновленную дату, либо дату создания, в зависимости от того, что наступит позже.

Как изменить код linq для достижения этой цели?Спасибо!

Ответы [ 2 ]

4 голосов
/ 10 марта 2011

Я пробовал этот запрос в LINQPad с БД Northwind, и он работал нормально:

from o in Orders
orderby o.RequiredDate > o.ShippedDate ? o.RequiredDate : o.ShippedDate
select new
{
    o.RequiredDate,
    o.ShippedDate
}
3 голосов
/ 10 марта 2011

Не знаю, хорошо ли я понял, о чем вы спрашиваете, но вот мое решение:

return from myclass in classes
       let updated = myclass.Updated ?? myclass.Created
       orderby updated descending
       select myclass;

Протестировано с классом с именем MyClass:

class MyClass
{
    public DateTime? Updated { get; set; }
    public DateTime Created { get; set; }
}

И с этими значениями:

MyClass[] classes = 
{
    new MyClass() { Created = DateTime.Now.AddDays(12)},
    new MyClass() { Created = DateTime.Now.AddDays(-5), Updated = DateTime.Now.AddDays(3)},
    new MyClass() { Created = DateTime.Now},
    new MyClass() { Created = DateTime.Now.AddDays(2), Updated = DateTime.Now.AddDays(10)},
    new MyClass() { Created = DateTime.Now},
    new MyClass() { Created = DateTime.Now.AddDays(1), Updated = DateTime.Now.AddDays(1)},
    new MyClass() { Created = DateTime.Now},
    new MyClass() { Created = DateTime.Now.AddDays(20), Updated = DateTime.Now.AddDays(4)}
};

Результат:

Updated = null - Created = 22/03/2011
Updated = 20/03/2011 - Created = 12/03/2011
Updated = 14/03/2011 - Created = 30/03/2011
Updated = 13/03/2011 - Created = 05/03/2011
Updated = 11/03/2011 - Created = 11/03/2011
Updated = null - Created = 10/03/2011
Updated = null - Created = 10/03/2011
Updated = null - Created = 10/03/2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...