LoginSignup
2
4

More than 3 years have passed since last update.

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

Posted at

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

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

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4