1Public Function OrderBy(Of TSource)(source As IQueryable(Of TSource), keySelector As Linq.Expressions.Expression(Of Func(Of TSource, String)), length As Integer) As IOrderedQueryable(Of TSource)
2 Dim zeroPadString = String.Empty.PadLeft(length, "0"c)
3 Return source.OrderBy(Function(x) DbFunctions.Right(zeroPadString + "ここにkeySelectorで指定された「x.Table.OrderNo」や「x.Table.OrderNo」といったものを挿入したい", length))
4End Function
補足情報(FW/ツールのバージョンなど)
VisualStudio 2015 Community
ASP.net MVC5
EntityFramework 6.3.0
.Net Framework 4.6.2
上記から Visual Studio のウィザードを利用して EDM を生成し、SqlFunctions.Replicate メソッドで FirstName に文字 '0' でパディングを入れるコード例を書いておきます。環境は、VS2015, .NET 4.6.1, EF 6.2 です。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.Entity;
using System.Data;
using System.Data.SqlClient;
namespace ConsoleAppJoinByLinq
{
class Program
{
static void Main(string[] args)
{
NORTHWINDEntities context = new NORTHWINDEntities();
int length = 10;
var emp = from e in context.Employees
select new
{
Id = e.EmployeeID,
// これは System.NotSupportedException: LINQ to Entities does not recognize ... となる
//PFname = System.Data.Objects.SqlClient.SqlFunctions.Replicate("0", length - e.FirstName.Length) + e.FirstName
// これは OK
PFname = System.Data.Entity.SqlServer.SqlFunctions.Replicate("0", length - e.FirstName.Length) + e.FirstName
};
foreach (var e in emp)
{
Console.WriteLine($"Id: {e.Id}, PFname: {e.PFname}");
}
// 結果は:
// Id: 1, PFname: 00000Nancy
// Id: 2, PFname: 0000Andrew
// Id: 3, PFname: 00000Janet
// Id: 4, PFname: 00Margaret
// Id: 5, PFname: 0000Steven
// Id: 6, PFname: 000Michael
// Id: 7, PFname: 0000Robert
// Id: 8, PFname: 00000Laura
// Id: 9, PFname: 000000Anne
}
}
}
コメントにも書きましたが、自分の環境では System.Data.Objects.SqlClient 名前空間の SqlFunctions クラスのメソッドは System.NotSupportedException: LINQ to Entities does not recognize ... となります。質問者さんの環境では分かりませんが注意してください。
投稿2019/10/12 04:32
退会済みユーザー
総合スコア0
0
SQL Server - System.Data.SqlClient 限定ですが、結果的には同等の並べ替えになるかと
C#
1using(var db = new MyDbContext())2{3 var q = db.MyItems
4.OrderBy(i => System.Data.Entity.SqlServer.SqlFunctions.DataLength(i.OrderNo.Replace("0"," ").TrimStart()))5.ThenBy(i => i.OrderNo.Replace("0"," ").TrimStart())6.Select(i => new
7{8 i.OrderNo,9 Length = System.Data.Entity.SqlServer.SqlFunctions.DataLength(i.OrderNo.Replace("0"," ").TrimStart()),10 a = i.OrderNo.Replace("0"," ").TrimStart()11})12.ToArray();13}
SQL Server Express でやってみましたが、string.Format を使った場合、対応していませんでした。また、ToString("00000") も対応していませんでした。一度文字列に直して足りない分を埋めるのは複文になるのでできませんでした。
SQL Server Express の場合は、プロバイダを作るしかなさそうです。ほかの対応状況も似たようなものだと思います。