Entity Framework では LINQ to Entities でデータ抽出ができて便利ですが、データベース関数を使いたいケースもあります。
どのような方法が用意されているか、EFバージョンごとに見ていきましょう。
Entity Framework 4/5
EF5 までの Entity Framework は .NET Framework の一部として提供され、NuGet パッケージで拡張されていました。
System.Data.Objects.EntityFunctions クラス
EntityFunctions クラスの静的メソッドを使用することで、標準的なSQL関数を呼び出すことができます。
たとえば、開始日から終了日までの日数を取得したいとき、
EntityFunctions.DiffDays(e.StartDate, e.EndDate)
のように記述すると、SQL Server であれば、
DATEDIFF (day, [Extent1].[StartDate], [Extent1].[EndDate])
のようなSQLに変換されます。
System.Data.Objects.SqlClient.SqlFunctions クラス
SQL Server 固有の組み込み関数を呼び出すことができます。
上記の日数取得は、SQL Server のみをターゲットに SqlFunctions で記述する場合、
SqlFunctions.DateDiff("day", e.StartDate, e.EndDate)
となります。
Entity Framework 6
EF6 は EntityFramework.dll を中心としたオープンソースのライブラリとして .NET Framework から独立して提供されるようになりました。
[System.Data.Entity.Core.Objects.EntityFunctions クラス] (https://docs.microsoft.com/en-us/dotnet/api/system.data.entity.core.objects.entityfunctions)
EntityFunctions は System.Data.Entity.Core.Objects 空間で提供されていますが、非推奨となっています。
System.Data.Entity.DbFunctions クラス
非推奨となった EntityFunctions クラスに代わって使用できます。
DbFunctions.DiffDays(e.StartDate, e.EndDate)
と書くと
DATEDIFF (day, [Extent1].[StartDate], [Extent1].[EndDate])
のように変換されます。
System.Data.Entity.SqlServer.SqlFunctions クラス
SQL Server 向けの SqlFunctions は System.Data.Entity.SqlServer.SqlFunctions 名前空間から提供されています。
SqlQuery メソッド
SqlQuery メソッドを使うことで、生のSQLクエリを直接指定して実行することもできます。
Entity Framework Core
Microsoft.EntityFrameworkCore.DbFunctions クラス
DbFunctions クラスが使用できます。
静的クラスだった EF6 と異なり、静的プロパティ経由でインスタンスとして提供されます。
EF.Functions.DateDiffDay(e.StartDate, e.EndDate)
と書くと
DATEDIFF(DAY, [a].[StartDate], [a].[EndDate])
のように変換されます。
FromSqlRaw 拡張メソッド
FromSqlRaw 拡張メソッドを使うことで、生のSQLクエリを直接指定して実行することもできます。