如何於 LINQ TO Entity 中執行 SQL Server 的 Stored Procedure

本文將介紹如何於 LINQ TO Entity 中執行 SQL Server 的 Stored Procedure。

假設您於 SQL Server 中建立以下的 Srored Procedure 用來回傳多筆資料的結果集(Result Set),若您想要利用 LINQ to Entity  來執行 Stored Procedure,可以參考下列的做法:

   1:  USE [Northwind]
   2:  GO
   3:  IF OBJECT_ID('dbo.usp_GetData') IS NOT NULL
   4:      DROP PROC dbo.usp_GetData
   5:  GO
   6:   
   7:  CREATE PROC [dbo].[usp_GetData](@msg nvarchar(10))
   8:  AS
   9:  BEGIN
  10:      SET NOCOUNT ON
  11:      SELECT 
  12:      (
  13:      SELECT TOP 2 RegionID
  14:      FROM Region
  15:      FOR XML RAW
  16:      ) c1
  17:      ,@msg    as c2
  18:      UNION ALL
  19:      SELECT 
  20:      (
  21:      SELECT TOP 2 RegionID
  22:      FROM Region
  23:      ORDER BY RegionID DESC
  24:      FOR XML RAW
  25:      ) c1
  26:      ,@msg    as c2
  27:  END
  28:   
  29:  GO

【執行結果】

image

  • 建立新項目。

image

  • 選擇【ADO.NET Entity Data Model】,於 Name 文字方塊中輸入【NWModel】,然後按 Add。

image

  • 由於我們是要將已經建立好的 Stored Procedure 產生相對應的物件,請在【Choose Model Contents】步驟中選擇【Genterate from database】,然後按 Next。

image

  • 於【Choose Model Contents】步驟中點選【New Connection】來建立連線,請依照您的環境輸入 Server name、Log on to the server 以及 select or enter a database name,然後按 OK。

image

  • 您可以選擇是否要將密碼儲存在連線字串當中,本文示範將密碼儲存在連線字串當中,您可以依照您的需求來選擇 Yes 或  No。另外,您也可以將連線字串儲存在組態檔。筆者是以 Console 應用程式為例,因此儲存連線字串的地方為 App.Config,接著按 Next。

image

  • 於【Choose Your Database Objects】步驟中勾選前面所建立的 Stored Procedure,接著設定 Model Namespace 為【NorthwindModel】,然後按 Finish。

image

  • 於 Model Browser 點選【Function Imports > Add Function Import】。

image

  • 於【Add Function Import】視窗中輸入 Function Import Name 為【GetData】,這個名稱將來會在您利用 .Net 程式碼呼叫對應 usp_GetData 這個 Stored Procedure 的時候用到,接著選擇 Stored Procedure Name 為【usp_GetData】,然後按【Get Column Information】按鈕,Visual Studio 會解析這個 Stored Procedure 回傳的結果集,接著您可以按【Create New Complex Type】來建立到時候接收回傳結果集的複雜型別,最後 Return a Collection Of 會自動選到【Cpmplex】,接著按 OK。

image

  • 接著輸入下列程式碼,後按 F5 執行。
   1:  using (NorthwindEntities context = new NorthwindEntities())
   2:  {
   3:      var query = context.GetData("test");
   4:      foreach (var item in query)
   5:      {
   6:          Console.WriteLine(String.Format("{0},{1}", item.c1, item.c2));
   7:      }
   8:  }
  • 執行結果如下:

image