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 ... となります。質問者さんの環境では分かりませんが注意してください。
SQL Server Express でやってみましたが、string.Format を使った場合、対応していませんでした。また、ToString("00000") も対応していませんでした。一度文字列に直して足りない分を埋めるのは複文になるのでできませんでした。
SQL Server Express の場合は、プロバイダを作るしかなさそうです。ほかの対応状況も似たようなものだと思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。