2

この質問をここで確認し、同様の解決策を提案している他の多くのリンクも確認しましたが、行くdistinctTable = dt.DefaultView.ToTable(true, "FILENAME");と次のようなエラーメッセージが表示されます。

'LOCATION' という名前のフィールドまたはプロパティは、選択したデータ ソースで見つかりませんでした。

これで、場所、フォルダー、ファイル名、ステータスの 4 つの列ができました。フォルダーとファイル名の値はデータベースから選択しますが、場所とステータスの値は C# コードによって決定されます。上記の行を省略しても問題なく動作するため、 Location 列が見つからないと言われている理由がわかりません。

一部のレコードはユーザー入力によって生成されている (つまり、データベースからのものではない) ため、SQL を使用できないと思います。

私も試してみました

view = new DataView(dt); 
distinctTable = view.ToTable(true, "LOCATION", "FOLDER", "FILENAME", "STATUS");

またはdistinctTable = view.ToTable(true, "FILENAME");後者のステートメントだけですが、これは何もしないようです-例外はスローされませんが、重複レコードも排除されません。

私は何を間違っていますか?

4

2 に答える 2

3

2 つの問題があるかのように表示されます。

  1. 派生テーブルにデータバインドするとエラーが発生します (私はそう思います)。
  2. 他のことを試してみると、エラーは発生しませんが、目的の個別のレコードも得られません。

上部に投稿するコード:

distinctTable = dt.DefaultView.ToTable(true, "FILENAME");

... は、正​​確に 1 つの列を持つデータ テーブルを提供します: FILENAME。したがって、それにバインドすると、バインド先が LOCATION 列も探している場合、エラーが発生します。

下部に投稿するコード:

view = new DataView(dt); 
distinctTable = view.ToTable(true, "LOCATION", "FOLDER", "FILENAME", "STATUS");

...テーブルの一部としてLOCATION(および他の列)があるため、エラーをスローしません。したがって、バインド先のコントロールはすべての列を見つけることができます。

しかし、あなたは重複を削除しないと言います。重複を削除したいが、出力用に 1 つの列のみを指定しているコードを表示する場合、レコード全体の正確な重複を除外するのではなく、 FILENAME 値は同じですが、他の列の値が異なります。

(私の知る限り) でそれを行うことはできませんDataView.ToTable。しかし、LINQ でそれを行うことができます。

DataTable distinctTable = dt.AsEnumerable()
                            .GroupBy(r=> r.Field<string>("FILENAME"))
                            .Select(g=>g.First())
                            .CopyToDataTable();
于 2013-02-25T16:39:02.157 に答える
0

LINQ を使用してみませんか?

var items = yourdatatable.AsEnumerable().Distinct();

于 2013-02-25T16:21:18.917 に答える