LINQ&按日期范围对数据进行分组

时间:2014-12-11 12:59:49

标签: c# linq linq-to-entities

假设我有以下数据集,我希望根据匹配描述的日期是否在彼此的几秒内对“描述”列进行分组。

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可以吗?

2 个答案:

答案 0 :(得分: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的{​​{1}}可确保我们获得 mininum 日期,如OP中所述。

使用此输入:

ItemGroup

你得到这个结果:

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} } 子句代替:

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 中减去的数字来改变,例如, 10与9或8等

答案 1 :(得分: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();