本文將介紹如何於 LINQ TO Entity 中執行 SQL Server 的 Stored Procedure。
假設您於 SQL Server 中建立以下的 Srored Procedure 用來回傳多筆資料的結果集(Result Set),若您想要利用 LINQ to Entity 來執行 Stored Procedure,可以參考下列的做法:
1: USE [Northwind]2: GO3: IF OBJECT_ID('dbo.usp_GetData') IS NOT NULL4: DROP PROC dbo.usp_GetData5: GO6:
7: CREATE PROC [dbo].[usp_GetData](@msg nvarchar(10))8: AS9: BEGIN10: SET NOCOUNT ON11: SELECT12: (
13: SELECT TOP 2 RegionID14: FROM Region15: FOR XML RAW16: ) c1
17: ,@msg as c218: UNION ALL19: SELECT20: (
21: SELECT TOP 2 RegionID22: FROM Region23: ORDER BY RegionID DESC24: FOR XML RAW25: ) c1
26: ,@msg as c227: END28:
29: GO
【執行結果】
- 建立新項目。
- 選擇【ADO.NET Entity Data Model】,於 Name 文字方塊中輸入【NWModel】,然後按 Add。
- 由於我們是要將已經建立好的 Stored Procedure 產生相對應的物件,請在【Choose Model Contents】步驟中選擇【Genterate from database】,然後按 Next。
- 於【Choose Model Contents】步驟中點選【New Connection】來建立連線,請依照您的環境輸入 Server name、Log on to the server 以及 select or enter a database name,然後按 OK。
- 您可以選擇是否要將密碼儲存在連線字串當中,本文示範將密碼儲存在連線字串當中,您可以依照您的需求來選擇 Yes 或 No。另外,您也可以將連線字串儲存在組態檔。筆者是以 Console 應用程式為例,因此儲存連線字串的地方為 App.Config,接著按 Next。
- 於【Choose Your Database Objects】步驟中勾選前面所建立的 Stored Procedure,接著設定 Model Namespace 為【NorthwindModel】,然後按 Finish。
- 於 Model Browser 點選【Function Imports > Add Function Import】。
- 於【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。
- 接著輸入下列程式碼,後按 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: }
- 執行結果如下: