2012-05-10 3 views
1

У меня есть запрос LINQ, который в настоящее время, как это:LINQ фильтрации между два раза и час

var query = from l in Records 
      where l.time >= time1 && l.time <= time2 
      select l; 

однако, коллекция записей используется для входа один раз каждые две секунды, теперь он записывает один раз в час. Мне нужен способ только захватить одну запись за час от старых данных, чтобы возвращаемые данные имели больше смысла, и поэтому я не возвращаю месяцы данных, регистрируемых каждые 2 секунды ... Любая помощь была бы замечательной.

+0

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

+0

Мне нужен список записей, которые находятся между time1 и time2, но только один раз в час. Итак, если time1 = "09/5/2012 - 14:00" и time2 = "09/05/2012 - 16:00", а в записях содержатся пункты 1. «09/5/2012 - 14:00» 2. « 05/5/2012 - 14:30 "3." 09/5/2012 - 15:22 "и 4." 09/5/2012 - 16:00 ". Мне нужны предметы 1, 3 и 4. Я надеюсь, что это немного облегчит ситуацию. – ThomasG

ответ

4

Итак, вы хотите только одну запись в час. Это означает, что вам необходимо группировать по часам:

var query = records 
      .Where(r => r.time >= time1 && r.time <= time2) 
      .Select(r => new 
      { 
       Hour = new DateTime(r.time.Year, r.time.Month, r.time.Day, r.time.Hour, 0, 0), 
       Record = r 
      }) 
      .GroupBy(x => x.Hour) 
      .Select(grp => grp.First().Record); 
+0

Спасибо. Работал. – ThomasG

+0

Быстрое примечание. Это не будет работать в LINQ-to-Entities. Это поддерживает только конструкторы без параметров и инициализаторы. – ThomasG

+0

@ThomasG: Вы не упомянули, что это LINQ-to-Entities. Во всяком случае, я не очень-то знаком с этим, но должно быть возможно создать анонимные типы, как я. http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/49a23b65-cdf8-4f58-b4a0-4effbe10c1ae/ –

1

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

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

var query = from l in Records 
      where l.time >= time1 && l.time <= time2 
      group l by l.time.Hour into g 
      select g.First(); 
+0

Это объединило бы весь день в один. Рассмотрим, что ОП имеет каждый час хотя бы одну запись. Он хочет ~ 30 * 24 записей в месяц. Ваш запрос будет возвращать только 24 записи (даже в течение всего года). –

Смежные вопросы