我有这个:
Dim strS As String = ""
Dim strRowFilter As String = "SID=" & strSID
Dim dv As DataView = objDataSet.Tables(1).DefaultView
dv.RowFilter = (strRowFilter)
dv.Sort = ("RIGHT(SName, CHARINDEX(' ', REVERSE(' ' + RTRIM(SName))) - 1)")
For Each objDataRow As DataRow In dv
'build strS
Next
Return strS
SName
是一个格式为Firstname Midname Lastname
的字符串(Midname可选),我需要按Lastname
排序。我知道有一些特殊的情况,比如'Mike St. Cloud',但我对排除最后一个字很好。上面的代码给了我System.IndexOutOfRangeException occurred: Cannot find column RIGHT(SName.
我从this获得了排序术语,它在SQL Server中用作ORDER BY
。我对这个问题不太了解,所以任何帮助都会受到赞赏。
答案 0 :(得分:1)
根据MSDN,Sort
属性为:
包含列名后跟" ASC"的字符串。 (升序)或" DESC" (降序)。默认情况下,列按升序排序。可以用逗号分隔多个列。
因为System.Data
命名空间中的某些类允许对某些事物使用类似SQL的语法(例如DataTable.Select
方法),所以人们常常会认为所有SQL语法都受支持。事实并非如此。在这种情况下,Sort
属性支持非常狭窄的功能。它只能设置为一个或多个列名称(以及ASC
或DESC
订单说明符)。它不支持RIGHT
和LEFT
等功能。
如果您真的想使用DataView
进行排序,可以在数据中添加一个附加列,其中包含您要对视图进行排序的字符串。当您在DataSet
中选择数据时,您可以使用所有这些SQL字符串操作方法来构建排序字符串以选择该排序列。
但是,除非您确实需要这样做,否则我建议您只创建Array
或List
数据,然后对其进行排序。当您这样做时,您可以访问.NET的所有字符串操作方法,这些方法更强大,更易于阅读。例如:
Dim names As New List(Of String)()
For Each row As DataRow In objDataSet.Tables(1).Rows
names.Add(CStr(row("SName")))
Next
names.Sort(Function(x, y) x.Split().Last.CompareTo(y.Split().Last))
答案 1 :(得分:1)
尝试一下:
Dim strS As String = ""
Dim dt As DataTable = objDataSet.Tables(1)
' create a lambda expression to split the name by " "
Dim splitName = Function(name As String) name.Split(" "c).Where(Function(s) s <> "")
' select rows that meet the SID filter and SName <> null and SName <> "",
' and get the SID, construct the FirstName and LastName,
' and of course, sort the return collection by LastName
Dim sortedrows = From row As DataRow In dt.Rows
Where (Not IsDBNull(row!SName) AndAlso Not String.IsNullOrWhiteSpace(CStr(row!SName)))
And CStr(row!SID) = strSID
Select PersonID = row!PersonID,
FirstName = splitName(CStr(row!SName)).FirstOrDefault,
LastName = splitName(CStr(row!SName)).LastOrDefault
Order By LastName
' finally, construct the <a> tags as required from above
For Each row In sortedrows
strS &= String.Format("<a href=""javascript: ViewPersonId({0}); return false;"">{1} {2}</a><br />", row.PersonID, row.FirstName, row.LastName)
Next
如果DataTable包含以下行:
dt.Rows.Add(1, "John Travolta")
dt.Rows.Add(2, "Jack The Ripper")
dt.Rows.Add(3, "Beyonce")
dt.Rows.Add(4, " ")
dt.Rows.Add(5, "")
dt.Rows.Add(6, DBNull.Value)
假设它们都符合SID过滤器,它将返回:
<a href="javascript: ViewPersonId(3); return false;">Beyonce Beyonce</a><br />
<a href="javascript: ViewPersonId(2); return false;">Jack Ripper</a><br />
<a href="javascript: ViewPersonId(1); return false;">John Travolta</a><br />
如您所见,"Beyonce"
显示为"Beyonce Beyonce"
。如果您不想要这种行为,可以通过检查For Each
循环中的FirstName = LastName并执行替代代码来构建<a>
标记来更改它。