我已经检查了这个问题here以及其他一些提出类似解决方案的链接,但是当我去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");
,但这似乎没有做任何事情 - 它不会抛出异常,但也不会消除重复记录。
我做错了什么?
答案 0 :(得分:3)
它看起来好像有两个问题:
您在顶部发布的代码:
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();
答案 1 :(得分:0)
如何使用LINQ?
var items = yourdatatable.AsEnumerable().Distinct();