2

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

在所选数据源中找不到名为“LOCATION”的字段或属性。

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

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

我也试过

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

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

我究竟做错了什么?

4

2 回答 2

3

读起来好像有两个问题:

  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();
于 2013-02-25T16:39:02.157 回答
0

使用 LINQ 怎么样?

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

于 2013-02-25T16:21:18.917 回答