从DataTable中选择不同的记录

本文关键字:记录 选择 DataTable | 更新日期: 2023-09-27 18:01:05

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

在上找不到名为"LOCATION"的字段或属性选定的数据源。

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

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

我也试过

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

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

我做错了什么?

从DataTable中选择不同的记录

读起来好像有两个问题:

  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怎么样?

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