0

我有一个名为 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 方法时,这具有明显的含义。

有谁知道为什么会这样?

4

2 回答 2

0

The DataTable.PrimaryKey property returns a simple unsorted array of DataColumn objects. If you want to sort them, take a look at Array.Sort. You'll need to implement an IComparer for the DataColumn type that compares instances by their .Ordinal property.

于 2009-02-24T03:42:03.687 回答
0

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

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

编辑

理想情况下,有人会编写一个看起来像 find 的扩展方法,但采用名称/值对,并根据 PrimaryKey 属性的当前值计算出正确的顺序。再次,它提出了在数据库中搜索是否更合适的问题。

于 2009-09-30T09:27:53.870 回答