假设我有以下数据集,我希望根据匹配描述的日期是否在彼此的几秒内对“描述”列进行分组。
我要查找的输出是该组的描述和最小日期。描述可能是相同的,但日期可能是天不同,在这种情况下,我想要两个输出行。
在上面的例子中,看一下描述" TEST s"我想要两个输出的分组行
TEST s 2014-12-04 16:27:44.903
TEST s 2014-12-04 17:21:21.233
使用Linq可以吗?
答案 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();