0

我正在使用数据表返回不同的记录,但不知何故它没有返回我尝试过的不同记录

dt.DefaultView.ToTable(true, "Id");
foreach (DataRow row in dt.Rows)
            {
                System.Diagnostics.Debug.Write(row["Id"]);

            }

它仍然返回我所有的记录。这里有什么问题?

更新

我的sql如下

   select  t.Update ,t.id as Id, t.name ,t.toDate,t.Age from  tableA  t  Where t.Id = 55 
   union
   select  t.Update ,t.id as Id, t.name ,t.toDate,t.Age  from tableB t  Where t.Id = 55
   order by Id

在我的查询中很难做到不同,因为这里提到的列很多。

4

4 回答 4

5

如果您使用数据库,最好使用 sql 只返回不同的记录(例如,使用DISTINCTGROUP BY窗口函数)。

如果要过滤内存中的表,还可以使用Linq-To-DataSet

dt = dt.AsEnumerable()
    .GroupBy(r=>r.Field<int>("Id")) // assuming that the type is `int`
    .Select(g=>g.First())           // take the first row of each group arbitrarily 
    .CopyToData‌​Table();

请注意,当您想要过滤这些行或者您不想任意获取每个 id-group 的第一行但例如最后一行(根据DateTime字段)时,Linq 的强大功能就开始了。也许您还想订购组或只返回前十个。没问题,只需使用OrderByand Take

于 2013-07-02T12:12:46.043 回答
2

问题是你没有抓住新表:

var newDt = dt.DefaultView.ToTable(true, "Id");
foreach (DataRow dr in newDt.Rows) ...

ToTable方法不会修改现有表 - 它会创建一个新表。

于 2013-07-02T12:04:37.130 回答
1
DataView view = new DataView(table);
DataTable distinctValues = view.ToTable(true, "Id");
于 2013-07-02T12:02:57.750 回答
0

您没有将返回值分配给任何变量,试试这个

DataTable dtnew = dt.DefaultView.ToTable(true, "Id");

foreach (DataRow row in dtnew.Rows)
{
    System.Diagnostics.Debug.Write(row["Id"]);
}
于 2013-07-02T13:00:37.030 回答