C# 从数据表中选择不同的记录

C# 从数据表中选择不同的记录,c#,asp.net,datatable,C#,Asp.net,Datatable,我已经检查了这个问题以及许多其他链接,它们都提出了类似的解决方案,但是当我转到distinctTable=dt.DefaultView.ToTabletrue时,FILENAME;我收到一条错误消息,上面说: 在上找不到名为“LOCATION”的字段或属性 选定的数据源 现在,我一共有四列:位置、文件夹、文件名和状态。我从数据库中选择文件夹和文件名的值,但位置和状态的值是通过C代码确定的。我不知道为什么它说找不到Location列,因为当我省略上面的行时,它工作得很好 我认为我不能使用SQL,因

我已经检查了这个问题以及许多其他链接,它们都提出了类似的解决方案,但是当我转到distinctTable=dt.DefaultView.ToTabletrue时,FILENAME;我收到一条错误消息,上面说:

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

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

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

我也试过了

view = new DataView(dt); 
distinctTable = view.ToTable(true, "LOCATION", "FOLDER", "FILENAME", "STATUS");
或者只是distinctTable=view.ToTabletrue,文件名;对于后一个语句,但这似乎没有任何作用-它不会引发异常,但也不会消除重复记录

我做错了什么?

使用LINQ怎么样


var items=yourdatatable.AsEnumerable.Distinct

读起来好像有两个问题:

当您将数据绑定到我假定的派生表时,会出现一个错误; 当您尝试其他操作时,不会出现错误,但也不会得到所需的不同记录。 您在顶部发布的代码:

distinctTable = dt.DefaultView.ToTable(true, "FILENAME");
。。。将为您提供一个只包含一列的数据表:FILENAME。因此,当您绑定到它时,如果您绑定到的内容也在查找位置列,那么您将得到一个错误

您在底部发布的代码:

view = new DataView(dt); 
distinctTable = view.ToTable(true, "LOCATION", "FOLDER", "FILENAME", "STATUS");
。。。不会引发错误,因为它将LOCATION和其他列作为表的一部分,因此绑定到的控件能够找到所有列

但你说它不会删除重复项。我想知道,当您说要删除重复项,但显示只指定一列作为输出的代码时,您是否不想过滤掉整个记录的完全重复项,而是过滤掉具有相同文件名值但其他列值不同的记录

据我所知,你不能用DataView.ToTable做这件事。但是你可以用LINQ来做:

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

调试时,在哪个语句上会出现错误?在bind语句上:gridview1.DataBind;因此,当您将数据绑定到。。。什么独特的桌子?@AnnL。对如果我绑定到我的原始表dt,它工作得很好没用。同样,它不会抛出错误,但不会消除重复项。可能DataRow没有实现IEquitable。你试过这个吗?是的,是的,我只想根据文件名过滤。其他列是否不同并不重要。我尝试了你的LINQ代码,但它在第一部分给了我一个错误:dt.AsEnumerable-表示它不包含AsEnumerable的定义尝试将assembly System.Data.DataSetExtensions添加到你的项目中。我尝试了,但看起来我没有那个程序集?它告诉我系统下没有DataSetExtensions。数据…也许我不清楚?我的意思是,在项目中添加对assembly System.Data.DataSetExtensions.dll的引用。ETA:你使用的是什么版本的.NET?我假设是4.0。啊,好的。在“解决方案资源管理器”窗口中的项目中,右键单击“引用”文件夹。选择“添加引用”。在打开的对话框的.NET选项卡中,等待几分钟以加载所有内容,单击组件名称列进行排序,然后查找名为System.Data.DataSetExtensions.dll的程序集。单击它,然后单击“确定”。