数据表中主键中的列是否会自动重新排序?

时间:2009-02-20 10:14:40

标签: c# datatable primary-key

我有一个名为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 :(得分:0)

DataTable.PrimaryKey属性返回一个简单的未排序的DataColumn对象数组。如果您想对它们进行排序,请查看Array.Sort。您需要为DataColumn类型实现IComparer,以通过其.Ordinal属性比较实例。

答案 1 :(得分:0)

也许查看数据表上的约束集合。如果这三列已经存在唯一约束,则在设置PrimaryKey属性时,DataTable将重用该属性(从逻辑上讲,主键中列的顺序与关系数据中的其他位置一样,意味着无关紧要)。 / p>

如果您无法控制现有的其他约束,则需要在设置后读取主键属性,并相应地重新排序Find参数。

修改

理想情况下,有人会编写一个类似于find的扩展方法,但需要使用Name / Value对,并根据PrimaryKey属性的当前值计算出正确的顺序。再次,它提出了在数据库中搜索是否更合适的问题。