从DataTable中选择不同的记录

时间:2013-02-25 15:40:29

标签: c# asp.net datatable

我已经检查了这个问题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");,但这似乎没有做任何事情 - 它不会抛出异常,但也不会消除重复记录。

我做错了什么?

2 个答案:

答案 0 :(得分:3)

它看起来好像有两个问题:

  1. 当您数据绑定到(我假设)您的派生表时,会出现错误;
  2. 当您尝试其他内容时,您不会收到错误,但也无法获得所需的不同记录。
  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();