如何从存储过程中获取输出结果在C#中使用Entity Framework?

beh*_*nam 4 c# sql-server stored-procedures

我正在开发一个ASP.NET MVC项目; 我的目标是从表中准备一份报告,这是我第一次写Linq代码但是速度太慢了.

之后我编写了一个SQL查询,它的速度非常快,我想使用存储过程从我的表中获取报表数据.事实上,我的项目非常简单:它有两个日期 - 开始日期和结束日期 - 并在表格中显示结果.

我想编写我的存储过程以从C#代码获取两个参数 - 开始日期和结束日期,然后在C#中的变量中返回输出.

第一个问题:如何将我的SQL查询转换为具有两个参数的存储过程,开始日期和结束日期?

第二个问题:如何在C#中返回输出结果?

SELECT 
    CAST(date_rec_slash AS DATETIME), COUNT(code_marz) AS total,
    CASE
       WHEN code_marz = 1 THEN 'a'
       WHEN code_marz = 2 THEN 'b'
       WHEN code_marz = 3 THEN 'c'
       WHEN code_marz = 4 THEN 'd'
       WHEN code_marz = 5 THEN 'e'
    END
FROM 
    dbo.tbl_bar 
WHERE 
    CAST(date_rec_slash AS DATETIME) BETWEEN '2017/12/01' AND '2017/12/31'
GROUP BY 
    CAST(date_rec_slash AS DATETIME), code_marz
ORDER BY 
    CAST(date_rec_slash AS DATETIME) ASC;
Run Code Online (Sandbox Code Playgroud)

C#:

var spResults = db.Database.SqlQuery<tbl_bar>("Report");
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Has*_*thi 7

使用以下语法声明您的商店过程:

    USE yourDataBaseNAme
    GO

    CREATE PROCEDURE [dbo].yourStoreProcedureName
    @startDate nvarchar(30), 
    @endDate   nvarchar(30)
    AS 
       SELECT Cast(date_rec_slash as datetime) AS 'date_rec_slash', count(code_marz) as total,
              CASE
                  WHEN code_marz = 1 THEN 'a'
                  WHEN code_marz = 2 THEN 'b'
                  WHEN code_marz = 3 THEN 'c'
                  WHEN code_marz = 4 THEN 'd'
                  WHEN code_marz = 5 THEN 'e'
              END AS 'code_marz'
      FROM dbo.tbl_bar 
     WHERE Cast(date_rec_slash as datetime) between @startDate 
                                                AND @endDate
     GROUP BY Cast(date_rec_slash as datetime), code_marz
     ORDER BY Cast(date_rec_slash as datetime) ASC;
    GO
Run Code Online (Sandbox Code Playgroud)

在EF中调用此存储过程:

db.Database.SqlQuery<yourObjectNameToCAST>("yourStoreProcedureName");
Run Code Online (Sandbox Code Playgroud)

使用EF中的参数调用存储过程:

SqlParameter startDate= new SqlParameter("@startDate", "Value");
SqlParameter endDate= new SqlParameter("@endDate", "Value");
db.Database.SqlQuery<yourObjectNameToCAST>("exec yourStoreProcedureName @startDate, @endDate", startDate, endDate).ToList();
Run Code Online (Sandbox Code Playgroud)

你的对象:

public class yourObjectNameToCAST
{
     public datetime date_rec_slash { get; set; }
     public int total { get; set; }
     public string code_marz { get; set; }
}
Run Code Online (Sandbox Code Playgroud)