2017-04-26 157 views
0

我完全困惑於如何使用實體框架核心使用存儲過程。如果存儲過程返回一個匿名類型,我該如何檢索數據?如果返回類型不是匿名的,我該怎麼辦?我如何添加輸入/輸出參數?實體框架核心,存儲過程

我在問這些問題,因爲無論我看,我都會得到不同的答案。我猜EF英孚正在迅速發展,微軟正在涉足很多想法。

回答

-1

如何添加輸入/輸出參數?

我要回答你的這個特定問題。

下面是兩個輸入和兩個輸出參數的T-SQL存儲過程

CREATE PROCEDURE [dbo].[yourstoredprocedure] 
-- Add the parameters for the stored procedure here 
    @varone bigint 
    ,@vartwo Date 
    ,@varthree double precision OUTPUT 
    ,@varfour bigint OUTPUT 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    -- YOUR CODE HERE 
    SET @varthree = 10.02; 
    SET @varfour = @varone; 
    return; 
END 

現在要執行使用實體框架的核心

MyContext.Database 
        .ExecuteSqlCommand(@"EXECUTE [yourstoredprocedure] " + 
             " {0} " + 
             ", {1} " + 
             ",@varthree OUTPUT " + 
             ", @varfour OUTPUT ", dataOne, dataTwo, outputVarOne, outputVarTwo); 


var outputResultOne= outputVarOne.Value as double?; 
var outputResultTwo= outputVarTwo.Value as long?; 

你可以通過你輸入這個存儲過程簡單地使用參數化查詢如上。您也可以創建命名參數。如對於輸出參數,我創建了兩個命名參數 -

var outputVarOne = new SqlParameter 
     { 
      ParameterName = "@varthree ", 
      DbType = System.Data.DbType.Double, 
      Direction = System.Data.ParameterDirection.Output 
     }; 
var outputVarTwo = new SqlParameter 
     { 
      ParameterName = "@varfour ", 
      DbType = System.Data.DbType.Int64, 
      Direction = System.Data.ParameterDirection.Output 
     }; 

,這是如何使用EF核心您執行與輸入和輸出參數的存儲過程。希望這可以幫助某人。

+0

@downvoter如果你downvote時解釋到,如果有什麼我做錯了,我想知道和糾正自己我會很感激。如果downvote沒有解釋,我永遠不會知道我在這裏做錯了什麼。 – Dhananjay

-1

該解決方案提供調用存儲過程並將返回值映射到已定義(非模型)實體的方法。 https://github.com/verdie-g/StoredProcedureDotNetCore

Microsoft解決了此問題: 「SQL查詢只能用於返回屬於您模型一部分的實體類型。我們的待辦事項有一個增強功能,可以從原始SQL查詢中返回即席類型。 https://docs.microsoft.com/en-us/ef/core/querying/raw-sql

這裏是在GitHub上跟蹤的問題:https://github.com/aspnet/EntityFramework/issues/1862

+0

歡迎您訪問解決方案的鏈接,但請確保您的答案在沒有它的情況下很有用:[在鏈接附近添加上下文](// meta.stackexchange.com/a/8259),以便您的同行用戶瞭解它是什麼以及爲什麼它在那裏,然後引用您鏈接的頁面中最相關的部分,以防目標頁面不可用。 [答案只是一個鏈接可能會被刪除。](// stackoverflow.com/help/deleted-answers) – FelixSFD

+0

謝謝,我編輯了我的答案,以提供更多的上下文。 – MORCHARD