我有以下存储过程:
CREATE PROCEDURE [dbo].[usp_GetReportLevel]
AS
DECLARE @TEMP TABLE (BK_REPORT_LEVEL INT, REPORT_LEVEL_NAME VARCHAR(MAX))
INSERT INTO @temp
VALUES (0, 'Client Group'), (1, 'Client'), (2, 'Related Matter'), (3, 'Matter')
SELECT *
FROM @TEMP
GO
这样的实体数据库:
public IEnumerable<usp_GetReportLevel_Result> usp_GetReportLevel()
{
//const string storedProcedure = "usp_GetReportLevel";
var result = Database.SqlQuery<usp_GetReportLevel_Result>($"EXEC usp_GetReportLevel");
return result;
}
usp_GetReportLevel_Result如下:
public class usp_GetReportLevel_Result
{
[Column("BK_REPORT_LEVEL")]
public int BK_REPORT_LEVEL;
[Column("REPORT_LEVEL_NAME")]
public string REPORT_LEVEL_NAME;
}
和构造函数中的C#代码,以从存储过程中选择列表项,如下所示:
List<SelectListItem> reportLevelList2= new List<SelectListItem>();
var reportLevelusp = context.usp_GetReportLevel();
foreach (var reportLevel in reportLevelusp)
{
SelectListItem lvl = new SelectListItem()
{
Text = reportLevel.REPORT_LEVEL_NAME,
Value = reportLevel.BK_REPORT_LEVEL.ToString()
};
reportLevelList2.Add(lvl);
}
ReportLevelList = reportLevelList2;
现在,如果我调试该代码,则foreach
将输入4次,告诉我它正在正确读取数据库值,但是值BK_REPORT_LEVEL
和REPORT_LEVEL_NAME
始终为0,并且分别为null。
为什么会这样?如果在数据库上执行该存储过程,则返回的是我期望的结果,为什么Linq
没有得到正确的数据?我看不到错误
答案 0 :(得分:1)
我以前在从Temp表中选择或从SQL SP中选择表变量时遇到问题。取决于要处理的SQL Server版本。您需要使用结果集:
{{3}}
将您的电话转换为使用此电话:
EXEC usp_GetReportLevel
WITH RESULT SETS
(
(
BK_REPORT_LEVEL INT,
REPORT_LEVEL_NAME varchar(max)
)
)
答案 1 :(得分:0)
尝试ExecuteSqlCommand:
_context.Database.ExecuteSqlCommand("myproc");
或带有返回参数:
SqlParameter stmt = new SqlParameter("@stmt", System.Data.SqlDbType.Varchar);
stmt.Direction = System.Data.ParameterDirection.Output;
_context.Database.ExecuteSqlCommand("myproc @stmt out", stmt);
var qry = stmt.value;
确保在该过程中也放入out参数。
答案 2 :(得分:0)
无需更改任何内容,一切都很好。我只需要在变量上添加{ get; set; }
。...
public class usp_GetReportLevel_Result
{
[Column("BK_REPORT_LEVEL")]
public int BK_REPORT_LEVEL { get; set; }
[Column("REPORT_LEVEL_NAME")]
public string REPORT_LEVEL_NAME { get; set; }
}