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 の能力が発揮されることに注意してください。グループを並べ替えたり、最初の 10 個だけを返したりすることもできます。問題ありません。 と を使用OrderByして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 に答える