2017-04-26 155 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