【问题标题】:Display the most recent entry of duplicates based on the Date Column of a DataTable根据数据表的日期列显示最近的重复条目
【发布时间】:2021-04-10 09:55:13
【问题描述】:

我有包含列的数据表:IDChapter NumberQuery IDDate"。
我有重复的问题,Query ID 相同,但日期不同。
我想在 DataGridView 中仅显示 Query ID 相同时具有最新日期的问题(一行)。
我还想显示不重复的问题(行)Query IDs。

我的桌子是这样的:

ID Chapter Number Query ID Date (DD-MM-YYYY)
1 Chapter-3 Q-03-05 04-05-2021
2 Chapter-3 Q-03-05 05-05-2021
3 Chapter-3 Q-03-04 06-05-2021
4 Chapter-3 Q-03-06 07-05-2021

我希望 DataGridView 中的表格条目是这样的:

ID Chapter Number Query ID Date (DD-MM-YYYY)
2 Chapter-3 Q-03-05 05-05-2021
3 Chapter-3 Q-03-04 06-05-2021
4 Chapter-3 Q-03-06 07-05-2021

这是我的代码:

Dim duplicates = 
   (From cust In SARDataSet.Table1
    Group By dupp = cust.Query_ID Into GP = Group
    Order By dupp Ascending
    Select GP).First()

For Each dw In duplicates
    DataGridView3.DataSource = duplicates.ToList()
Next

【问题讨论】:

    标签: vb.net winforms linq date datagridview


    【解决方案1】:

    您要根据组对结果进行排序,您应该使用存储Date 对象的列按降序排序,然后取第一个。
    然后循环尝试将结果转换为 List 多次。你显然不想这样。

    假设 Column 实际上存储的是日期而不是字符串。
    如果您存储了字符串,请将 Column Type 更改为 DateTime (Date),否则对该 Column 进行排序将永远无法达到预期的结果。

    如果不幸的是您的项目中还没有 System.Data.DataSetExtension,请添加对 System.Data.DataSetExtension 的引用。我将日期类型列命名为 QueryDate,因为我不知道它的实际名称。

    在这里,我正在生成一个包含过滤结果的新 DataTable,并将其设置为 DataGridView 的 DataSource:

    Dim dtNew = SARDataSet.Table1.AsEnumerable().
        GroupBy(Function(dr) dr("Query ID")).
        Select(Function(grp) 
            grp.OrderByDescending(Function(dr) dr("QueryDate")).First()).
        CopyToDataTable()
    
    ' In case a source of data is already assigned
    DataGridView3.DataSource = Nothing
    ' Set the new data
    DataGridView3.DataSource = dtNew
    

    LINQ 代码在做什么:

    • AsEnumerable():将 DataTable 读取为 DataRows 对象的集合
    • GroupBy() => dr("Query_ID"):根据 Query_ID 列的值对 DataRows 对象进行分组
    • Select(Function(grp):枚举生成的组和...
    • grp.OrderByDescending(Function(dr) dr("QueryDate")) ...按日期列按降序排列每个组中的数据行(最近的日期在前),然后...
    • First(): ...获取有序列表中的第一个 DataRow
    • CopyToDataTable():将生成的 IEnumerable(Of DataRow) 转换为新的 DataTable 对象。

    【讨论】:

    • 感谢您分享您的好建议。我已经尝试过这段代码并给出错误; System.ArgumentException:“列 'Query_ID' 不属于表 Table1。”表 1 中存在“Query_ID”。请指导我。
    • 你不知道这些列的名称是什么吗?在此代码的第一行设置断点并检查 DataTable 的列以查看它们的名称,然后将此处使用的名称替换为真实名称。就是这样。
    • 谢谢吉米。我已将 Query_ID 更改为“查询 ID”现在它正在工作
    • 感谢 Jimi 先生的建议。
    猜你喜欢
    • 2013-06-18
    • 2018-05-30
    • 1970-01-01
    • 2018-08-15
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 2013-11-27
    • 1970-01-01
    相关资源
    最近更新 更多