SQL语句与LINQ to SQL之间的输出排序结果不同

问题描述 投票:2回答:1

我的数据库中有一个数据表,它只有一列,以字符串数据类型存储唯一键。代码段及其数据如下所示

CREATE TABLE MyTable (    
   KEY_CODE varchar(5)
);

insert into MyTable(KEY_CODE) values('00');
insert into MyTable(KEY_CODE) values('-01');
insert into MyTable(KEY_CODE) values('01');
insert into MyTable(KEY_CODE) values('02');
insert into MyTable(KEY_CODE) values('03');
insert into MyTable(KEY_CODE) values('T');

然后我查询我所有的KEY_CODE项目,并按KEY_CODE ASC对其进行排序

select * from MyTable 
order by KEY_CODE

这是MS SQL Server Management Studio中的输出结果。您可以看到MS SSMS理解键“ -01”小于“ 00”和“ 01”。

enter image description here

现在,在我的VB.NET项目中,我还有一个具有相同列和数据的数据表。但是KEY_CODE列的顺序与MS SSMS的顺序不匹配。您可以在调试模式下看到我在下面的捕获图像中提到的输出数据表。 “ -01”键不在结果顶部。

我期望从LINQ到SQL的订购结果应与来自MS SSMS的订购结果相同。我该如何实现?

Dim myTable As DataTable = New DataTable("MyTable")
Dim col As DataColumn = New DataColumn("KEY_CODE")
col.DataType = System.Type.GetType("System.String")

myTable.Columns.Add(col)

Dim row1 As DataRow = myTable.NewRow()
Dim row2 As DataRow = myTable.NewRow()
Dim row3 As DataRow = myTable.NewRow()
Dim row4 As DataRow = myTable.NewRow()
Dim row5 As DataRow = myTable.NewRow()
Dim row6 As DataRow = myTable.NewRow()

row1.Item("KEY_CODE") = "00"
row2.Item("KEY_CODE") = "-01"
row3.Item("KEY_CODE") = "01"
row4.Item("KEY_CODE") = "02"
row5.Item("KEY_CODE") = "03"
row6.Item("KEY_CODE") = "T"

myTable.Rows.Add(row1)
myTable.Rows.Add(row2)
myTable.Rows.Add(row3)
myTable.Rows.Add(row4)
myTable.Rows.Add(row5)
myTable.Rows.Add(row6)

Dim datarows As DataRow() = myTable.Select()
Dim output = (From row In datarows
              Order By "KEY_CODE ASC"
              Select row Distinct).CopyToDataTable()

enter image description here

sql vb.net sorting linq-to-sql
1个回答
0
投票

网上有很多关于LINQ to SQL的教程,但并不是将SQL语法作为字符串注入LINQ查询中。相反,您使用看似有效的VB.NET代码编写代码,并具有强大的类型检查功能和自动完成功能,但实际上并没有运行您的代码,而是通过分析表达式树并使用反射将其转换为SQL语句。尝试从数据库中查看所需内容并生成一条SQL语句来获取它。因为它是经过转换并在数据库引擎上运行的,所以它具有一些细微的差异,例如在SQL中与Visual Basic中的行为相比,可空类型在行为上略有不同,并且您获得了SQL行为。

这样的查询:

   From Item in new DataContext().Items 
   WHERE Item.Key_Code>0
   Order By Item.KEY_CODE 
   SELECT KeyCode=Item.KEY_CODE, Member=Item.Member

会生成几乎反映此查询的SQL。它不会做的是将整个Items表放入内存并在Visual Basic中执行“ where”,“ order by”或“ Select”。

您的带有]的代码>

Dim output = (From row In datarows
              Order By "KEY_CODE ASC"
              Select row Distinct).CopyToDataTable()

从内存对象(数据行)开始,而不是数据上下文开始,因此LINQ将在Visual Basic中完成,它的功能比LINQ TO SQL大得多。它会不断地将“ KEY_CODE ASC”作为每行的字符串进行比较,并且由于所有结果都是相同的,因此无法更改顺序。

将其更改为以下内容:

Dim output = (From row In MyTable.Rows.Cast(of DataRow)
              Order By row.item("KEY_CODE")
              Select row Distinct).CopyToDataTable()

Dim output = (From row as DataRow In MyTable
                  Order By row.item("KEY_CODE")
                  Select row Distinct).CopyToDataTable()

顺便说一句,在LINQ表达式中有多种处理数据行的方法,但是由于DataRow集合在LINQ之前就已经存在,所以有点古怪,所以我展示了两种在DataTable上进行LINQ查询的替代方法。

© www.soinside.com 2019 - 2024. All rights reserved.