Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在分组中选择字段_C#_.net_Linq - Fatal编程技术网

C# 在分组中选择字段

C# 在分组中选择字段,c#,.net,linq,C#,.net,Linq,我的数据表中有如下数据: 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.Fi

我的
数据表中有如下数据:

   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")) });
myDataTable.AsEnumerable().GroupBy(x=>x.Field(“vrn”))。选择(x=>new{vrn=x.Key,seenDate=x.Max(y=>y.Field(“seenDate”));
我需要修改上述内容,以同时选择
id
字段(即,我不想在此字段上分组,但我想将其包含在结果数据集中)


我无法在
Select()
部分中输入
x.Field(“id”)
,因为Field子句不存在。

您可以像这样使用Select new从数据中选择任何需要的内容

var query = from pro in db.Projects
                select new { pro.ProjectName, pro.ProjectId };

您需要一个等效的
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"),
    });
var result=myDataTable.AsEnumerable()
.GroupBy(x=>x.Field(“vrn”))
.Select(g=>g.OrderByDescending(x=>x.Field(“seenadate”)).First()
.选择(x=>new
{
vrn=x.字段(“vrn”),
id=x.字段(“id”),
seenDate=x.字段(“seenDate”),
});

如果您在同一
vrn
中可能有几个
ID
具有相同的最大日期,则以下操作将起作用:

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 rows=myDataTable.AsEnumerable()
.GroupBy(x=>x.Field(“vrn”))
.选择(x=>new
{
分组=x,
MaxSeenDate=x.Max(y=>y.Field(“seenDate”))
})
.SelectMany(arg=>
arg.Grouping.Where(y=>y.Field(“seenDate”)==arg.MaxSeenDate));
它将重新运行原始
数据行的
IEnumerable
,这样您就有了所有字段


或者,您可以添加另一个select以仅包含所需的字段。

以及要包含的
Id
字段是什么?例如,
vrn
ABC有两个id值。@IvanStoev最近看到的一个id值有很多关于sql的问题和解决方案。您是否只需要Linq中的解决方案,还是可以使用sql中的解决方案?@Shadow不幸的是,在我的情况下,它必须在Linq中完成,因为数据已经在数据表中。例如,请参阅:抱歉,我正在使用cell phon进行回答,因此我无法使用代码插件指定查询中的代码位置?Var query=from MyDataTable中的项选择new{vrn=item.vrn}不过,您粘贴的是一个单独的查询。我需要修改上面粘贴的查询,虽然这正是我要找的。干得好,谢谢。