选择分组中的字段

时间:2017-04-20 10:42:26

标签: c# .net linq

我的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子句不存在。

3 个答案:

答案 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)

如果同一个idsvrn的最长日期相同,则以下内容可能会有效:

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}},以便您拥有所有字段。

或者您可以添加另一个选择以仅包含您需要的字段。