使用 VB.NET、Framework 4.0、EF5、VS2010
作为 Linq 的初学者,我尝试了很多东西,但无法使其正常工作。
Dim ctx As New Context
Dim query = (From a In ctx.TblAddress
Where (a.ID = 103)
Order By a.StreetAddress
Select a.ID, a.StreetAddress).ToList()
然后我将此实体绑定到 RadGrid。
但我想将 StreetAddresses 排序为字母数字。
我可以管理它来处理这样的字符串数组:
Dim address As String() = {"Street Name C21", "Street Name A12",
"Street Name B26", "Street Name B17", "Street Name C2", "Street Name B6"}
Dim sortedAddresses() As String = address.OrderBy(Function(s) Regex.Match(s, "^\D").Length =0).ThenBy(Function(s) Regex.Match(s, "\D*").Value).ThenBy(Function(s) Int32.Parse(Regex.Match(s,"\d+").Value)).ToArray()
但我不能让它在查询中工作。
甚至在第二个查询中。像这样的东西:
失败:
Dim q2 = query.AsEnumerable().OrderBy(Function(s) Regex.Match(s, "^\D").Length = 0).ThenBy(Function(s) Regex.Match(s, "\D*").Value)
我还看到了一个 MSSQL 查询完成了这项工作,但我宁愿让它在 linq to entity 中工作。
SQL 查询看起来像这样(它完成了工作):
Select StreetAddress, Row_Number() Over (Order by Case When IsNumeric(ID) = 1 then Right(Replicate('0',21) + ID, 20)
When IsNumeric(ID) = 0 then Left(ID + Replicate('',21), 20)
Else ID
END) As RowNumber, ID From TblAddress where ID = 103
是的,我已经做了 2 天的谷歌搜索,并在 SO.. 上进行了搜索。到目前为止还没有运气:-(
我还在这里看到了使用 LINQ 进行字母数字排序的解决方案,但我不知道如何解决它。
然后我在 C# 中看到了这个解决方案,但对于 ListBox,现在越来越接近解决方案了(至少我是这么想的……)但是在尝试使它与 RadGrid 一起工作之后,我终于放弃了它。
var list = listBox.Items.Cast<ListItem>()
.OrderBy(item => int.Parse(item.Text.TrimStart('B')));
listBox.Items.Clear();
listBox.Items.AddRange(list.ToArray());
我完全迷失了,到处都没有预期的结果。:)
请协助...