如何对数据表的主键数组进行排序

时间:2019-02-08 18:33:29

标签: vb.net

我正在尝试对数据表中的主键数组进行排序。我找不到与我的尝试相符的示例。

我需要比较两个数据列数组。这需要排序(至少使用我能设计的唯一方法)。

我将在这里发布我的问题的答案:How to find the differences between two datatables

我正在尝试提出一种有效的解决方案。我可以将名称复制到单独的数组中,对它们进行排序和比较,但是这种方法很难维护代码。如果那是唯一的方法,那么我会做的,但是这些方法名称告诉我,还有更好的方法。

已填充数据表,并且已正确填充PrimaryKey数组。但是我无法使用这些方法:

    DTS.PrimaryKey.ToList().Sort(Function(x, y) x.Caption.CompareTo(y.Caption))
    DTT.PrimaryKey.ToList().Sort(Function(x, y) x.Caption.CompareTo(y.Caption))

或这些:

    DTS.PrimaryKey.OrderBy(Function(c) c.Caption)
    DTT.PrimaryKey.OrderBy(Function(c) c.Caption)

在获得相同结果之前和之后:

?DTS.PrimaryKey(0).Caption
"Manufacturer"
?DTS.PrimaryKey(1).Caption
"Make"
?DTT.PrimaryKey(0).Caption
"Manufacturer"
?DTT.PrimaryKey(1).Caption
"Style"

DTS和DTT都定义为System.Data.DataTable。 我创建了几个简单的表格进行测试:

CREATE TABLE [dbo].[AAA](
    [Manufacturer] [nchar](10) NOT NULL,
    [Make] [nchar](10) NOT NULL,
    [Color] [nchar](10) NULL,
 CONSTRAINT [PK_AAA] PRIMARY KEY CLUSTERED 
(
    [Manufacturer] ASC,
    [Make] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,     ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

AND

CREATE TABLE [dbo].[AAA](
    [Manufacturer] [nchar](10) NOT NULL,
    [Style] [nchar](10) NOT NULL,
    [Color] [nchar](10) NULL,
 CONSTRAINT [PK_AAA] PRIMARY KEY CLUSTERED 
(
    [Manufacturer] ASC,
    [Style] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

我不在乎它们以什么顺序(升序或降序),只要它具有某种顺序即可:

?DTS.PrimaryKey(0).Caption
"Make"
?DTS.PrimaryKey(1).Caption
"Manufacturer"
?DTT.PrimaryKey(0).Caption
"Manufacturer"
?DTT.PrimaryKey(1).Caption
"Style"

OR

?DTS.PrimaryKey(0).Caption
"Manufacturer"
?DTS.PrimaryKey(1).Caption
"Make"
?DTT.PrimaryKey(0).Caption
"Style"
?DTT.PrimaryKey(1).Caption
"Manufacturer"

编辑:

我可以使用以下代码进行排序:

    Dim s = DTS.PrimaryKey.OrderBy(Function(c) c.Caption)
    Dim t = DTT.PrimaryKey.OrderBy(Function(c) c.Caption)

但是我不喜欢编写让程序员跟随我猜测的代码。我希望明确定义这些变量。当我检查类型时,我得到:

"System.Linq.OrderedEnumerable`2[System.Data.DataColumn,System.String]"

看起来有些古怪。另外,我似乎无法明确定义该类型的变量。面对强类型变量,这似乎不可行。

1 个答案:

答案 0 :(得分:0)

    Dim s As IOrderedEnumerable(Of DataColumn) = dt.PrimaryKey.OrderBy(Function(c) c.Caption)

由于编译器知道数据类型,因此它是强类型的,没有显式声明。