【问题标题】:Columns in a primary key on a datatable being re-ordered automatically?自动重新排序数据表主键中的列?
【发布时间】:2009-02-20 10:14:40
【问题描述】:

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

有人知道为什么会这样吗?

【问题讨论】:

    标签: c# datatable primary-key


    【解决方案1】:

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

    【讨论】:

    • 也许我在这里遗漏了一些东西,但我不确定“DataTable.PrimaryKey 属性返回一个简单的未排序的 DataColumn 对象数组”这一事实是否相关。我希望我的键数组中的第一项是主键中的第一列,第二项是第二个等等。
    • 当我尝试使用 Rows.find 方法时,我必须传入的参数必须与它们在 Permissions.PrimaryKey 属性中显示的顺序相同。考虑到我将 PrimaryKey 属性设置为一个数组,其中的项目按我想要的顺序排列,这似乎不正确。
    【解决方案2】:

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

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

    编辑

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

    【讨论】:

      猜你喜欢
      • 2010-10-18
      相关资源
      最近更新 更多