2015年11月15日

EntityFramework(17):SQL ステートメントの直接実行

  
EntityFrameworkでは、SQL文を直接実行することもできます。
使う場面は限られると思いますが、この機能があるとなにかと便利です。

  using (var db = new NorthwindContext()) {
      db.SetLogging();
      var q = @"select * from Customers where Country = @p0 and City = @p1";
      var customers = db.Database.SqlQuery(q, "Spain", "Madrid");
      foreach (var cust in customers) {
          Console.WriteLine($"{cust.CustomerID}, {cust.CompanyName}, {cust.ContactTitle}");
      }
  }

SqlParameter使うと、こんな風にも書けます。

 using (var db = new NorthwindContext()) {
     db.SetLogging();
     var q = @"select * from Customers where Country = @country and City = @city";
     var param1 = new SqlParameter("@country", "Spain");
     var param2 = new SqlParameter("@city", "Madrid");
     var customers = db.Database.SqlQuery(q, param1, param2);
     foreach (var cust in customers) {
         Console.WriteLine($"{cust.CustomerID}, {cust.CompanyName}, {cust.ContactTitle}");
     }
 }

INSERT, UPDATE, DELETE を発行したい場合は、SqlQuery の代わりに、ExecuteSqlCommand を使います。
戻り値は、削除した件数などコマンド実行後にデータベースによって返される結果となります。 

 using (var db = new NorthwindContext()) {
     db.SetLogging();
     var q = @"exec CustOrderHist @p0";
     var customers = db.Database.SqlQuery(q, "ALFKI");
     foreach (var cust in customers) {
         Console.WriteLine($"{cust.ProductName}, {cust.Total}");
     }
 }

 ...
 public class CustOrderHist {
     public string ProductName { get; set; }
     public int Total { get; set; }
 }

ストアドプロシージャもSqlQuery、ExecuteSqlCommand を使って呼び出すことができます。
 


 

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

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