【问题标题】:Remove duplicates and get only records with the earliest date in a LINQ expression删除重复项并仅获取 LINQ 表达式中日期最早的记录
【发布时间】:2020-09-07 13:08:31
【问题描述】:

我的代码需要帮助。

我设计了一个 LINQ 查询来从我的数据表中删除重复项。

问题是我需要添加一个额外的过滤器,我可以在其中过滤重复项并仅获取日期最早的记录。

就像您在下面看到的那样,我已将 orderby 添加到我的查询中,但它抛出了一个错误:

实例参数:不能从 'System.Linq.IGrouping' 到 'System.Data.DataRow'

还有这个:

System.Linq.IGrouping' 没有 包含“字段”的定义和最佳扩展方法 重载'System.Data.DataRowExtensions.Field(System.Data.DataRow, string)' 有一些无效参数

具有日期但为字符串格式的字段是:x.Field("Effective date")

.OrderBy(x => x.Field<string>("Effective date"))

我已经写了一些代码:

ErrorMessage = "";
                CollectionOut = new DataTable();
                DataTable dt1 = new DataTable();
            try
            {


                dt1 = CollectionIn;

                DataTable dtMerged = dt1.AsEnumerable()
                                    .GroupBy(r => new {d= r.Field<string>("Employee ID"), f=r.Field<string>("Report update date") })
                                    .OrderBy(x => x.Field<string>("Effective date"))
                                    .Select(g => g.First()).CopyToDataTable();
                CollectionOut = dtMerged;
            }
                catch (Exception ex)
            {
                ErrorMessage = ex.Message.ToString();
                
            }

我不知道如何解决这个问题。

感谢您的帮助!

【问题讨论】:

  • OrderBy 返回一个 IGroupings 的 IEnumerable,因此您不能在该步骤之后按数据行的属性进行排序。我认为如果您只是将 GroupBy 与 OrderBy 语句交换,它已经可以工作了。不了解您的数据库结构,但您可能还应该注意空组,因此您应该使用 Select(g => g.FirstOrDefault()).Where(r => r != null)。

标签: c# linq


【解决方案1】:

您可以执行以下代码。

DataTable dtMerged = dt1.AsEnumerable()
            .GroupBy(r => new {d= r.Field<string>("Employee ID"), f=r.Field<string>("Report update date") })
            .Select(g => g.OrderBy(x => x.Field<string>("Effective date")).First()).CopyToDataTable();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    • 2019-09-27
    • 2022-12-06
    • 2015-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多