我有一个名为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方法时,这有明显的含义。
有谁知道为什么会这样?
答案 0 :(得分:0)
DataTable.PrimaryKey属性返回一个简单的未排序的DataColumn对象数组。如果您想对它们进行排序,请查看Array.Sort。您需要为DataColumn类型实现IComparer,以通过其.Ordinal属性比较实例。
答案 1 :(得分:0)
也许查看数据表上的约束集合。如果这三列已经存在唯一约束,则在设置PrimaryKey属性时,DataTable将重用该属性(从逻辑上讲,主键中列的顺序与关系数据中的其他位置一样,意味着无关紧要)。 / p>
如果您无法控制现有的其他约束,则需要在设置后读取主键属性,并相应地重新排序Find参数。
修改强>
理想情况下,有人会编写一个类似于find的扩展方法,但需要使用Name / Value对,并根据PrimaryKey属性的当前值计算出正确的顺序。再次,它提出了在数据库中搜索是否更合适的问题。