1

我有这个:

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(中间名可选),我需要按Lastname. 我知道有像“Mike St. Cloud”这样的特殊情况,但我可以按最后一个词排序。上面的代码给了我System.IndexOutOfRangeException occurred: Cannot find column RIGHT(SName.

我从this中得到了排序术语,它ORDER BY在 SQL Server 中工作。我对此一无所知,因此将不胜感激。

4

2 回答 2

1

根据MSDN,该Sort属性是:

包含列名的字符串,后跟“ASC”(升序)或“DESC”(降序)。默认情况下,列按升序排序。多列可以用逗号分隔。

由于System.Data命名空间中的某些类允许对某些事物(例如DataTable.Select方法)使用类似 SQL 的语法,因此人们常常会误以为支持所有 SQL 语法。事实并非如此。在这种情况下,该Sort属性支持非常狭窄的功能。它只能设置为一个或多个列名(以及ASCorDESC顺序说明符)。它不支持 和 之类RIGHT的功能LEFT

如果你真的想使用 排序DataView,你可以在数据中添加一个额外的列,其中包含你想要对视图进行排序的字符串。当您将数据选择到 中时DataSet,您可以使用所有这些 SQL 字符串操作方法来构建排序字符串以选择到该排序列中。

但是,除非您真的需要这样做,否则我建议您只创建一个ArrayList数据然后对其进行排序。当您这样做时,您可以访问 .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))
于 2013-04-25T17:59:34.360 回答
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>标签来更改它。

于 2013-04-26T02:59:51.157 回答