Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9707

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

$
0
0

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


Viewing all articles
Browse latest Browse all 9707

Trending Articles