Столбцы в первичном ключе таблицы данных переупорядочиваются автоматически? - PullRequest
0 голосов
/ 20 февраля 2009

У меня есть таблица с именем Permissions, которая определена в наборе данных с именем _permissionsSet и имеет 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 в моей таблице данных.

Кто-нибудь знает, почему это происходит?

Ответы [ 2 ]

0 голосов
/ 30 сентября 2009

Может быть, посмотрите на коллекцию ограничений в вашей таблице данных. Если для этих трех столбцов уже есть уникальное ограничение, то при установке свойства PrimaryKey DataTable будет использовать его повторно (поскольку логически порядок столбцов в первичном ключе, как и в других местах реляционных данных, не имеет значения).

Если у вас нет контроля над этим другим существующим ограничением, вам нужно прочитать свойство Primary Key после его установки и соответствующим образом изменить порядок аргументов Find.

Редактировать

В идеале кто-то написал бы метод расширения, который выглядел бы как поиск, но взял бы пары Имя / Значение и определил правильный порядок на основе текущего значения свойства PrimaryKey. Здесь снова возникает вопрос о том, будет ли поиск в базе данных более подходящим.

0 голосов
/ 24 февраля 2009

Свойство DataTable.PrimaryKey возвращает простой несортированный массив объектов DataColumn. Если вы хотите отсортировать их, взгляните на Array.Sort . Вам нужно будет реализовать IComparer для типа DataColumn, который сравнивает экземпляры по их свойству .Ordinal.

...