0

_permissionsSet という名前のデータセットで定義されている Permissions という名前のテーブルがあり、3 つの列があります: PermissionGroup、Permission、PermissionLevel (この順序で)

このように3つの列すべてを含めるようにテーブルの主キーを設定しました

DataColumn[] keys = new DataColumn[3];
keys[0] = _permissionsSet.Permissions.Columns[0];
keys[1] = _permissionsSet.Permissions.Columns[1];
keys[2] = _permissionsSet.Permissions.Columns[2];

_permissionsSet.Permissions.PrimaryKey = keys;

「キー」の値を見ると、期待どおりです。

? keys
{System.Data.DataColumn[3]}
[0]: {PermissionGroup}
[1]: {Permission}
[2]: {PermissionLevel}

しかし、主キーを見ると、順序が変わっています!

? _permissionsSet.Permissions.PrimaryKey
{System.Data.DataColumn[3]}
[0]: {PermissionGroup}
[1]: {PermissionLevel}
[2]: {Permission}

これは、データテーブルで Rows.find メソッドを使用する場合に明らかな意味を持ちます。

なぜこれが起こっているのか誰にも分かりますか?

4

2 に答える 2

0

たぶん、データテーブルの制約コレクションを見てください。これらの3つの列にすでに一意の制約がある場合、PrimaryKeyプロパティを設定すると、DataTableはそれを再利用します(論理的には、リレーショナルデータの他の場所と同様に、主キーの列の順序は無関係です)。

既存の他の制約を制御できない場合は、設定後に主キープロパティを読み取り、検索引数を適切に並べ替える必要があります。

編集

理想的には、誰かがfindのように見える拡張メソッドを作成しますが、名前と値のペアを取り、PrimaryKeyプロパティの現在の値に基づいて正しい順序を計算します。ここでも、データベースでの検索がより適切かどうかという問題が発生します。

于 2009-09-30T09:27:53.870 に答える
0

DataTable.PrimaryKey プロパティは、単純なソートされていない DataColumn オブジェクトの配列を返します。それらを並べ替えたい場合は、Array.Sortを見てください。インスタンスを .Ordinal プロパティで比較する DataColumn 型の IComparer を実装する必要があります。

于 2009-02-24T03:42:03.687 に答える