2015年11月08日

EntityFramework(15):正規関数を利用する

  
クエリの中で SQLの DATEDIFF 関数を呼び出したい時、どうすればよいでしょうか?
Entity Frameworkでは、DbFunctions クラスの静的メソッドとして、たくさんの関数(これを正規関数と呼んでいる)を定義しています。
分散や標準偏差を求める関数もこの中にはあります。詳しくは、このページを見てください。

DATEDIFF関数に対応する DiffDays メソッドも用意されています。

このDiffDaysを使ったコードをいかに示します。

            using (var db = new NorthwindContext()) {
                var orders = db.Orders
                               .Where(x => DbFunctions.DiffDays(x.OrderDate, x.ShippedDate) < 2);
                foreach (var order in orders) {
                    Console.WriteLine($"{order.OrderID}, {order.OrderDate}, {order.ShippedDate}");
                }
            }

発行されるSQLは、以下の通りです。

SELECT
   [Extent1].[OrderID] AS [OrderID],
   [Extent1].[CustomerID] AS [CustomerID],
   [Extent1].[EmployeeID] AS [EmployeeID],
   [Extent1].[OrderDate] AS [OrderDate],
   [Extent1].[RequiredDate] AS [RequiredDate],
   [Extent1].[ShippedDate] AS [ShippedDate],
   [Extent1].[ShipVia] AS [ShipVia],
   [Extent1].[Freight] AS [Freight],
   [Extent1].[ShipName] AS [ShipName],
   [Extent1].[ShipAddress] AS [ShipAddress],
   [Extent1].[ShipCity] AS [ShipCity],
   [Extent1].[ShipRegion] AS [ShipRegion],
   [Extent1].[ShipPostalCode] AS [ShipPostalCode],
   [Extent1].[ShipCountry] AS [ShipCountry]
   FROM [dbo].[Orders] AS [Extent1]
   WHERE (DATEDIFF (day, [Extent1].[OrderDate], [Extent1].[ShippedDate])) < 2

DATEDIFF関数が使われていることが確認できます。

では、もう一つ。RIGHT関数を呼び出す例です。

 using (var db = new NorthwindContext()) {
     db.Database.Log = sql => { Console.Write(sql); };
     var customers = db.Customers
                    .Where(x => DbFunctions.Right(x.ContactName,6).ToLower() == "wilson");
     foreach (var cust in customers) {
         Console.WriteLine($"{cust.CustomerID}, {cust.CompanyName}, {cust.ContactName}");
     }
 }

発行されるSQL文は以下の通りです。

SELECT
    [Extent1].[CustomerID] AS [CustomerID],
    [Extent1].[CompanyName] AS [CompanyName],
    [Extent1].[ContactName] AS [ContactName],
    [Extent1].[ContactTitle] AS [ContactTitle],
    [Extent1].[Address] AS [Address],
    [Extent1].[City] AS [City],
    [Extent1].[Region] AS [Region],
    [Extent1].[PostalCode] AS [PostalCode],
    [Extent1].[Country] AS [Country],
    [Extent1].[Phone] AS [Phone],
    [Extent1].[Fax] AS [Fax]
    FROM [dbo].[Customers] AS [Extent1]
    WHERE N'wilson' = (LOWER(RIGHT([Extent1].[ContactName], cast(6 as bigint))))

このDbFunctionsクラスは、Entity Framework の以前のバージョンでは、EntityFunctions と呼ばれていたこともあります。


 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/52439482