关于如何使用Entity Framework Core使用存储过程,我完全感到困惑。如果存储过程返回匿名类型,我该如何检索数据?如果返回类型不是匿名的,我该怎么办?如何添加输入/输出参数?
我问这些问题,因为无论我看到什么,我都得到了不同的答案。我猜EF Core正在快速发展,微软正在涉及很多想法。
如何添加输入/输出参数?
我要回答你的这个特殊问题。
下面是一个带有两个输入和两个输出参数的TSQL存储过程
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
现在使用Entity Framework Core执行此存储过程
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 Core执行带有输入和输出参数的存储过程的方法。希望这有助于某人。
你可能会使用像StoredProcedureEFCore这样的扩展程序
然后使用更直观。
List rows = null;
ctx.LoadStoredProc("dbo.ListAll")
.AddParam("limit", 300L)
.AddParam("limitOut", out IOutParam<long> limitOut)
.Exec(r => rows = r.ToList<Model>());
long limitOutValue = limitOut.Value;
ctx.LoadStoredProc("dbo.ReturnBoolean")
.AddParam("boolean_to_return", true)
.ReturnValue(out IOutParam<bool> retParam)
.ExecNonQuery();
bool b = retParam.Value;
ctx.LoadStoredProc("dbo.ListAll")
.AddParam("limit", 1L)
.ExecScalar(out long l);
此解决方案提供了调用存储过程并将返回值映射到已定义(非模型)实体的方法。 https://github.com/verdie-g/StoredProcedureDotNetCore
Microsoft解决了这个问题:“SQL查询只能用于返回作为模型一部分的实体类型。我们的backlog上有一个增强功能,可以从原始SQL查询中返回特殊类型。” https://docs.microsoft.com/en-us/ef/core/querying/raw-sql
以下是GitHub中跟踪的问题:https://github.com/aspnet/EntityFramework/issues/1862