Help us understand the problem. What is going on with this article?

[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 クラスの静的メソッドを使用することで、標準的な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クエリを直接指定して実行することもできます。

CodeOne
【品質と生産性にこだわるシステム開発】 .NET(C#/VB.NET)専門・リモート開発歴10年。即日・1時間から頼める常駐しないエンジニア。確かな技術で開発チームを手堅くサポートします。
https://codeone.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした