【问题标题】:Selecting distinct records from DataTable从 DataTable 中选择不同的记录
【发布时间】:2013-02-10 19:33:14
【问题描述】:

我已经检查了这个问题here 以及许多其他链接都提出了类似的解决方案,但是当我去distinctTable = dt.DefaultView.ToTable(true, "FILENAME"); 时,我收到一条错误消息:

在 选定的数据源。

现在,我总共有四列:位置、文件夹、文件名和状态。我从数据库中选择的文件夹和文件名的值,但位置和状态的值是通过 C# 代码确定的。我不知道为什么它说找不到 Location 列,因为当我省略上面的行时它可以正常工作。

我认为我不能使用 SQL,因为某些记录是由用户输入生成的(即它们不是来自数据库)。

我也试过了

view = new DataView(dt); 
distinctTable = view.ToTable(true, "LOCATION", "FOLDER", "FILENAME", "STATUS");

或者只是 distinctTable = view.ToTable(true, "FILENAME"); 用于后一个语句,但这似乎没有任何作用 - 它不会引发异常,但也不会消除重复记录。

我做错了什么?

【问题讨论】:

  • 调试时,具体是在哪个语句上报错的?
  • 关于绑定语句:gridview1.DataBind();
  • 因此,当您将数据绑定到...时,您实际上遇到了错误……什么?不同的表?
  • @AnnL。是的。如果我绑定到我的原始表 dt,它可以正常工作。

标签: c# asp.net datatable


【解决方案1】:

看起来好像有两个问题:

  1. 当您将数据绑定到(我假设)您的派生表时出现错误;
  2. 当您尝试其他方法时,您不会收到错误消息,但也不会获得所需的不同记录。

您在顶部发布的代码:

distinctTable = dt.DefaultView.ToTable(true, "FILENAME");

... 将为您提供一个只有一列的数据表:FILENAME。因此,当您绑定到它时,如果您绑定的对象也在寻找 LOCATION 列,您将收到错误消息。

您在底部发布的代码:

view = new DataView(dt); 
distinctTable = view.ToTable(true, "LOCATION", "FOLDER", "FILENAME", "STATUS");

... 不会引发错误,因为它具有 LOCATION(和其他列)作为表的一部分,因此您绑定到的控件能够找到所有列。

但你说它不会删除重复项。我想知道,当您说要删除重复项,但在仅指定一列输出的情况下显示代码时,您是否想要过滤掉整个记录的确切重复项,而是过滤掉那些FILENAME 值相同,但其他列的值不同。

你不能(据我所知)用DataView.ToTable 做到这一点。但是你可以用 LINQ 做到这一点:

DataTable distinctTable = dt.AsEnumerable()
                            .GroupBy(r=> r.Field<string>("FILENAME"))
                            .Select(g=>g.First())
                            .CopyToDataTable();

【讨论】:

  • 是的,我只想根据文件名进行过滤。其他列是否不同并不重要。我尝试了您的 LINQ 代码,但它在第一部分给了我一个错误:dt.AsEnumerable() - 说它不包含 AsEnumerable 的定义
  • 尝试将程序集System.Data.DataSetExtensions 添加到您的项目中。
  • 我试过了,但看起来我没有那个程序集?它告诉我 System.Data 下没有 DataSetExtensions...
  • 也许我不清楚?我的意思是,向项目中添加对程序集 (System.Data.DataSetExtensions.dll) 的引用。 ETA:您使用的是哪个版本的 .NET?我假设是 4.0。
  • 啊,好的。在“解决方案资源管理器”窗口中,在您的项目中,右键单击“引用”文件夹。选择“添加参考”。在打开的对话框的 .NET 选项卡中,等待几分钟以加载所有内容,单击“组件名称”列进行排序,然后查找名为 System.Data.DataSetExtensions.dll 的程序集。单击它,然后单击确定。
【解决方案2】:

使用 LINQ 怎么样?

var items = yourdatatable.AsEnumerable().Distinct();

【讨论】:

  • 我试过 distinctTable = dt.AsEnumerable().Distinct().CopyToDataTable(); - 没用。同样,它不会抛出错误,但不会消除重复
  • 也许 DataRow 没有实现 IEquitable。你试过这个stackoverflow.com/questions/14165335/…
猜你喜欢
  • 1970-01-01
  • 2013-03-31
  • 1970-01-01
  • 2019-03-22
  • 2019-05-02
  • 1970-01-01
  • 2021-12-08
  • 1970-01-01
  • 2015-12-27
相关资源
最近更新 更多