見出し画像

[Entity Framework] LINQ to Entities からデータベース関数を呼び出す(~EF5/EF6/EF Core)

Entity Framework では LINQ to Entities でデータ抽出ができて便利ですが、データベース関数を使いたいケースもあります。
どのような方法が用意されているか、EFバージョンごとに見ていきましょう。

Entity Framework 4/5

EF5 までの Entity Framework は .NET Framework の一部として提供され、NuGet パッケージで拡張されていました。

System.Data.Objects.EntityFunctions クラス

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 クラス

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クエリを直接指定して実行することもできます。

この記事が気に入ったらサポートをしてみませんか?