2009-02-20 3 views
0

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

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

ответ

0

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

+0

Возможно, мне что-то не хватает, но я не уверен, что факт, что свойство DataTable.PrimaryKey возвращает простой несортированный массив объектов DataColumn, имеет значение. Я хочу, чтобы первый элемент в моем массиве ключей был первым столбцом в первичном ключе, второй - вторым и т. Д. – P2000

+0

Whe Я пытаюсь использовать метод Rows.find, параметры, которые мне нужно передать, должны быть в том же порядке, что и в свойстве Permissions.PrimaryKey. Это кажется неправильным, поскольку я устанавливаю свойство PrimaryKey в массив с элементами в том порядке, в котором они мне нужны. – P2000

0

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

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

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

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