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()
しかし、クエリで機能させることはできません。
または、2 番目のクエリでも。このようなもの:
失敗:
Dim q2 = query.AsEnumerable().OrderBy(Function(s) Regex.Match(s, "^\D").Length = 0).ThenBy(Function(s) Regex.Match(s, "\D*").Value)
作業を行ったMSSQLクエリも見ましたが、エンティティへのlinqで動作するようになりました。
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 を使用した Alphanumeric sortingのソリューションへの道も見ましたが、解決方法がわかりませんでした。
それから、C# でこのソリューションを見ましたが、ListBox の場合は、ソリューションに近づきました (少なくともそれは私が思っていたことです...)。
var list = listBox.Items.Cast<ListItem>()
.OrderBy(item => int.Parse(item.Text.TrimStart('B')));
listBox.Items.Clear();
listBox.Items.AddRange(list.ToArray());
私は完全に道に迷っており、期待どおりの結果が得られずにどこでも破片を取ります。:)
手伝ってください...