我的DataTable
内有以下数据:
id vrn seenDate
--- ---- --------
1 ABC 2017-01-01 20:00:05
2 ABC 2017-01-01 18:00:09
3 CCC 2016-05-05 00:00:00
我正在尝试将数据修改为仅显示最近日期的vrn
值。这是我到目前为止所做的:
myDataTable.AsEnumerable().GroupBy(x => x.Field<string>("vrn")).Select(x => new { vrn = x.Key, seenDate = x.Max(y => y.Field<DateTime>("seenDate")) });
我需要修改上面的内容以选择id
字段(即我不想在此字段上进行分组,但我希望将其包含在结果数据集中)。
我不能在x.Field<int>("id")
部分放入Select()
,因为Field子句不存在。
答案 0 :(得分:5)
您需要MoreLINQ中等效的MaxBy
方法。
在标准LINQ中,可以使用OrderByDescending
+ First
次呼叫进行模拟:
var result = myDataTable.AsEnumerable()
.GroupBy(x => x.Field<string>("vrn"))
.Select(g => g.OrderByDescending(x => x.Field<DateTime>("seenDate")).First())
.Select(x => new
{
vrn = x.Field<string>("vrn"),
id = x.Field<int>("id"),
seenDate = x.Field<DateTime>("seenDate"),
});
答案 1 :(得分:0)
您可以使用这样的新选项从数据中选择您想要的任何内容
var query = from pro in db.Projects
select new { pro.ProjectName, pro.ProjectId };
答案 2 :(得分:0)
如果同一个ids
中vrn
的最长日期相同,则以下内容可能会有效:
IEnumerable<DataRow> rows = myDataTable.AsEnumerable()
.GroupBy(x => x.Field<string>("vrn"))
.Select(x => new
{
Grouping = x,
MaxSeenDate = x.Max(y => y.Field<DateTime>("seenDate"))
})
.SelectMany(arg =>
arg.Grouping.Where(y => y.Field<DateTime>("seenDate") == arg.MaxSeenDate));
它会退回原始IEnumerable
的{{1}},以便您拥有所有字段。
或者您可以添加另一个选择以仅包含您需要的字段。