C# 分组中的Linq第一个值-为什么不起作用?

C# 分组中的Linq第一个值-为什么不起作用?,c#,sql,vb.net,linq,C#,Sql,Vb.net,Linq,我问了一个关于如何使用Linq从数据表中获取特定数据的问题,并提出了一个解决方案,我认为可以做到这一点,但它并没有给出我所期望的结果 基本上,假设我要查询以下数据: Col_A: Col_B: Col_C: Col_D: Date1: Date2: a1 b1 c1 d1 Dt1_1 Dt2_1 a1 b2 c2 d2 Dt1_1

我问了一个关于如何使用Linq从数据表中获取特定数据的问题,并提出了一个解决方案,我认为可以做到这一点,但它并没有给出我所期望的结果

基本上,假设我要查询以下数据:

Col_A:     Col_B:     Col_C:    Col_D:    Date1:     Date2:
a1         b1         c1        d1        Dt1_1      Dt2_1
a1         b2         c2        d2        Dt1_1      Dt2_2
a1         b3         c3        d3        Dt1_1      Dt2_3
a1         b4         c4        d4        Dt1_2      Dt2_4
a1         b5         c5        d5        Dt1_2      Dt2_5
并且,就日期而言,假设,例如,1<2。 所以,我想要的是,对于列A中的每个值,为每个日期1得到一行,为最早的日期2

所以,根据这些数据,我想回去:

Col_A:     Col_B:     Col_C:    Col_D:    Date1:     Date2:
a1         b1         c1        d1        Dt1_1      Dt2_1
a1         b4         c4        d4        Dt1_2      Dt2_4
换句话说,自从Date1发生了变化,我们得到了最早的Date2的数据。 我希望这是有道理的

我不能使用复杂的查询来获取数据,因为它来自一个非常旧的数据库模型,不支持许多现代的分组函数

所以,我想到的是:

SQL查询:

这给了我有序的数据,我将其查询到.Net中的数据表中

现在,我基本上想要Col_A和Date1组合的每个值的第一条记录,所以我提出了以下Linq语句:

Dim y As DataTable = (From dr As DataRow In OriginalData
    Group dr By k = New With {.Col_A= dr.Field(Of String)("Col_A"), .Date1 = dr.Field(Of Date)("Date1")} Into grp = Group
    Select grp.First).CopyToDataTable
我原以为这样就可以了,但它返回的y行数与原始数据表的行数相同,换句话说,它没有删除所有的重复项

当我仔细查看它时,它似乎没有进行分组-它基本上将每一行视为一个新的组*

我做错了什么?如何更改此Lync查询以提供正确的结果

此外,即使Linq是用VB编写的,我也同样熟悉C

谢谢

希望这有助于:

 public class Test
 {
    public DateTime Date1;
    public DateTime Date2;
    public string Col_A;
 }


这应该做你想做的-第一组按Col_A和Date1,然后按Date2对组进行排序,并从每个组中选择第一项

originalData.GroupBy(row => new { row.Col_A, row.Date1 })
            .Select(group => group.OrderBy(groupRow => groupRow.Date2)
                                  .First())
            .ToList();

他想要最小的日期,所以你应该按升序排序,而不是降序。由于组不能为空,我建议使用First而不是FirstOrDefault,因为后者意味着在某些情况下可能存在一个空组,并且您的结果中可能会得到空引用,但事实并非如此。无论出于何种原因,它都不会进行分组。。。有什么想法吗?无论出于什么原因,它都不会进行分组。。。有什么想法吗?时间戳完全一样吗?或者,例如,它们只是在同一个日期,但在一天中的时间不同?是的-我可以在即时窗口中执行类似于?originalData.Rows1.ItemDate1.equaloriginaldata.Rows2.ItemDate1的操作,并且它返回TRUE-Col_A相同。。。我是否必须创建一个类并创建自己的equalitycomparer??这是怎么回事?这是我的愚蠢在这里找到了正确的解决方案。。这与EqualityComparer和我编写查询的方式有关。。。。
List<Test> test = new List<Test>();
test.GroupBy(t => t.Col_A).Select(group =>
                          group.OrderBy(e => e.Date2).First())
                          ToList();
originalData.GroupBy(row => new { row.Col_A, row.Date1 })
            .Select(group => group.OrderBy(groupRow => groupRow.Date2)
                                  .First())
            .ToList();