Я получил список, содержащий все элементы статуса каждого заказа.
Проблема, которая у меня есть, заключается в том, что мне нужно удалить все элементы, у которых комбинация статус -> logdate не самая высокая.
* 1003 например *
var inputs = new List<StatusItem>();
//note that the 3th id is simply a modifier that adds that amount of secs
//to the current datetime, to make testing easier
inputs.Add(new StatusItem(123, 30, 1));
inputs.Add(new StatusItem(123, 40, 2));
inputs.Add(new StatusItem(123, 50, 3));
inputs.Add(new StatusItem(123, 40, 4));
inputs.Add(new StatusItem(123, 50, 5));
inputs.Add(new StatusItem(100, 20, 6));
inputs.Add(new StatusItem(100, 30, 7));
inputs.Add(new StatusItem(100, 20, 8));
inputs.Add(new StatusItem(100, 30, 9));
inputs.Add(new StatusItem(100, 40, 10));
inputs.Add(new StatusItem(100, 50, 11));
inputs.Add(new StatusItem(100, 40, 12));
var l = from i in inputs
group i by i.internalId
into cg
select
from s in cg
group s by s.statusId
into sg
select sg.OrderByDescending(n => n.date).First()
;
edit: для удобства я добавляю также определение класса.
public class StatusItem
{
public int internalId;
public int statusId;
public DateTime date;
public StatusItem(int internalId, int statusId, int secMod)
{
this.internalId = internalId;
this.statusId = statusId;
date = DateTime.Now.AddSeconds(secMod);
}
}
Это создает список, который возвращает мне следующее:
заказ 123, статус 30, дата 4/9/2010 18:44:21 PM
заказ 123 статус 40 дата 09.04.2010 18:44:24
заказ 123 статус 50 дата 09.04.2010 18:44:25
заказ 100 статус 20 дата 09.04.2010 18:44:28
заказ 100 статус 30 дата 09.04.2010 18:44:29
заказ 100 статус 40 дата 9.04.2010 18:44:32
заказ 100 статус 50 дата 09.04.2010 18:44:31
Это почти правильно. Однако эту последнюю строку, которая имеет статус 50, также необходимо отфильтровать, поскольку она была отменена статусом 40 в списке истории. Вы можете сказать по тому, что его дата ниже, чем у «последнего» элемента статуса со статусом 40.
Я надеялся, что кто-нибудь подскажет мне, потому что я застрял.
Редактировать: Окончательное решение:
var k = from sg in
from i in inputs
group i by i.internalId
into cg
select
from s in cg
group s by s.statusId
into sg
select sg.OrderByDescending(n => n.date).First()
from s in sg
where s.date >= sg.Where(n => n.statusId <= s.statusId).Max(n => n.date)
group s by s.internalId
into si
from x in si
select x;