2014-12-11 3 views
0

Скажем, у меня есть следующий набор данных, где я хочу сгруппировать столбец «Описание» в зависимости от того, находятся ли даты для сопоставления описаний в течение нескольких секунд друг от друга.LINQ & Группировка данных по диапазону дат

enter image description here

Выход Я ищу это описание и минимальная дата для этой группы. Возможно, что описание может быть одним и тем же, но даты могут отличаться друг от друга, в этом случае я хотел бы получить два выведенных строки.

В случае, описанном выше, посмотрите на описание "TEST S", где я хотел бы два выводимые сгруппированных строк

TEST s 2014-12-04 16: 27: 44,903

TEST s 2014- 12-04 17: 21: 21.233

Можно ли использовать Linq?

+0

так что вы хотите использовать несколько групп бай от? http://stackoverflow.com/questions/5231845/c-sharp-linq-group-by-on-multiple-columns – Ric

+0

@Ric Больше группы, Мин в терминах TSQL, но с отдельными строками, где даты выходят из ассортимент. Честно говоря, я не уверен, как назвать это в TSQL. –

+0

Можете ли вы привести пример группировки строк, которые находятся «в течение нескольких секунд друг от друга». Пример, который у вас есть, в каждой группе одинаковый. – juharr

ответ

0

Попробуйте это:

var q = from item in lstMyTable 
     group item by item.ItemDate.ToString("MM/dd/yyyy HH:mm") into ItemGroup 
     select new 
     { 
      Description = ItemGroup.First().Description, 
      Date = ItemGroup.OrderBy(x => x.ItemDate).First().ItemDate 
     }; 

вышеуказанных групп запросов LINQ по дате + час + минут, игнорируя секунд. Код OrderBy, примененный к ItemGroup, гарантирует, что мы получим дату mininum, как описано в OP.

С этим входом:

List<MyTable> lstMyTable = new List<MyTable>() 
{ 
    new MyTable() { Description = "TEST s", ItemDate = new DateTime(2014, 12, 4, 16, 27, 11) }, 
    new MyTable() { Description = "TEST s", ItemDate = new DateTime(2014, 12, 4, 16, 27, 12) }, 
    new MyTable() { Description = "TEST s", ItemDate = new DateTime(2014, 12, 4, 16, 27, 13) }, 

    new MyTable() { Description = "TEST s", ItemDate = new DateTime(2014, 12, 4, 17, 21, 11) }, 
    new MyTable() { Description = "TEST s", ItemDate = new DateTime(2014, 12, 4, 17, 21, 12) }, 
    new MyTable() { Description = "TEST s", ItemDate = new DateTime(2014, 12, 4, 17, 21, 13) } 
}; 

вы получите этот результат:

[0] = { Description = "TEST s", Date = {4/12/2014 4:27:11 pm} } 
[1] = { Description = "TEST s", Date = {4/12/2014 5:21:11 pm} } 

Если вы хотите также группа по описанию, то просто substitue оговорку group by с СТГ, как это:

group item by new 
{ 
    a = item.ItemDate.ToString("MM/dd/yyyy HH:mm") , 
    b = item.Description 
} into ItemGroup 

И наконец, путем преобразования поля Datetime в Ticks, вы можете играть с требуемым временным расстоянием между отдельными записями, например.

group item by new 
{ 
    a = item.ItemDate.Ticks.ToString().Substring(0, item.ItemDate.Ticks.ToString().Length - 10), // instead of .ToString("MM/dd/yyyy HH:mm") , 
    b = item.Description 
} into ItemGroup 

Вы можете играть вокруг, изменяя количество цифр вычитаются из item.ItemDate.Ticks, заменяя, например, 10 с 9 или 8 и т.д.

+0

Я считаю, что OP хочет также группировать описание. – juharr

+0

@juharr хорошо, я сосредоточился на случае, который он описывает. Мои выборочные данные основаны на этом случае. –

+0

@GiorgosBetsos Это достаточно близко к тому, что мне нужно. благодаря –

0

Если вы хотите, левая сторона будет список, то вы можете попробовать это

var query = (from t in db.Table 
      group t by new {t.Description, t.Date } 
      into grp 
      select new 
      { 
       grp.Key.Description, 
       grp.Key.Date,       
      }).ToList(); 
Смежные вопросы