【发布时间】:2011-07-16 02:39:19
【问题描述】:
下面的 LINQ 查询工作正常,但我需要稍微调整一下。
我希望文件中的所有记录按recordId(客户编号)分组,然后按日期降序排列。我正在分组,日期按降序排列。现在,调整来了。
我希望按 recordId 升序对组进行排序。目前,这些组是按日期排序的,或者看起来是这样。我尝试在 .GroupBy 之后添加一个 .OrderBy ,但根本无法让它工作。
最后,我想 .take(x) 记录其中 x 取决于其他一些因素。基本上, .take(x) 将返回最近的 x 记录。我尝试将 .take(x) 放在不同的地方,但没有得到正确的结果。
var recipients = File.ReadAllLines(path)
.Select (record => record.Split('|'))
.Select (tokens => new
{
FirstName = tokens[2],
LastName = tokens[4],
recordId = tokens[13],
date = Convert.ToDateTime(tokens[17])
}
)
.OrderByDescending (m => m.date)
.GroupBy (m => m.recordId)
.Dump();
编辑 #1 - recordId 不是唯一的。可能/可能会有多条记录具有相同的recordId。 recordId 实际上是一个客户编号。
输出将是一个包含名字、姓氏、日期和记录 ID 的结果集。根据多种因素,每个 recordId 会返回 1 到 5 条记录。
编辑 #2 - .Take(x) 用于记录 ID。每个 recordId 可能有多行。现在,假设我想要每个 recordId 的最新日期。 (按日期降序排序时选择 top(1))
编辑#3 -
以下查询生成以下结果。请注意,每个 recordId 仅在输出中产生 1 行(这没关系),并且它似乎是最近的日期。我还没有彻底检查过。
现在,我如何按 recordId 升序排序?
var recipients = File.ReadAllLines(path)
.Select (record => record.Split('|'))
.Select (tokens => new
{
FirstName = tokens[2],
LastName = tokens[4],
recordId = Convert.ToInt32(tokens[13]),
date = Convert.ToDateTime(tokens[17])
}
)
.GroupBy (m => m.recordId)
.OrderByDescending (m => m.Max (x => x.date ) )
.Select (m => m.First () )
.Dump();
FirstName LastName recordId date
X X 2531334 3/11/2011 12:00:00 AM
X X 1443809 10/18/2001 12:00:00 AM
X X 2570897 3/10/2011 12:00:00 AM
X X 1960526 3/10/2011 12:00:00 AM
X X 2475293 3/10/2011 12:00:00 AM
X X 2601783 3/10/2011 12:00:00 AM
X X 2581844 3/6/2011 12:00:00 AM
X X 1773430 3/3/2011 12:00:00 AM
X X 1723271 2/4/2003 12:00:00 AM
X X 1341886 2/28/2011 12:00:00 AM
X X 1427818 11/15/1986 12:00:00 AM
【问题讨论】:
-
你能展示你想要的样子吗?这会有所帮助
-
按日期对一组记录进行排序是什么意思?是否在同一日期具有相同 recordId 的所有项目?
-
您想要每个日期的前 N 条记录吗?对于每个记录 ID?为了使这个问题有意义,您应该显示一些示例输出。
-
你能澄清一下 Take 要求吗?您是指每个 RecordId 中的最新 N 吗?还是全球最新的(所有记录)?