C# 尝试使用Sql查询在ASP.NET MVC中执行存储过程时发生异常

C# 尝试使用Sql查询在ASP.NET MVC中执行存储过程时发生异常,c#,asp.net-mvc,entity-framework,stored-procedures,for-json,C#,Asp.net Mvc,Entity Framework,Stored Procedures,For Json,我正在使用实体框架,但有一个分层数据源。在控制器中进行db查询和转换为json需要很长时间 因此,我有一个存储过程 直接在MicrosoftSQLServerManagementStudio中执行存储过程,我得到了预期的输出 但是尝试在我的控制器中执行以下操作会引发以下异常 `IEnumerable<MyItem> itemsJson=Context.Database.SqlQuery<MyItem>("Get_JSON_MyItems").ToList();`

我正在使用实体框架,但有一个分层数据源。在控制器中进行db查询和转换为json需要很长时间

因此,我有一个存储过程

直接在MicrosoftSQLServerManagementStudio中执行存储过程,我得到了预期的输出

但是尝试在我的控制器中执行以下操作会引发以下异常

  `IEnumerable<MyItem> itemsJson=Context.Database.SqlQuery<MyItem>("Get_JSON_MyItems").ToList();` 
`IEnumerable itemsJson=Context.Database.SqlQuery(“Get_JSON_MyItems”).ToList()`
System.Data.Entity.Core.EntityCommandExecutionException:'数据 读取器与指定的“MyDataModel.MyItem”不兼容。 类型“Id”的成员在中没有相应的列 具有相同名称的数据读取器。'

我猜数据读取器会将字符串拆分为多个字段,因为它太长了?但我不确定,也不知道如果是这样的话,我该怎么解决

--


(还尝试在控制器中写入命令,而不是执行存储过程)

FOR JSON
将导致查询返回一行和一列,列名称没有意义(基本上是一个包含完整JSON负载的单元格)。例如,它没有
Id
列,因此EF不知道如何填充模型

我建议您需要:

  • 删除JSON的
    用法
  • 确保查询中返回的列与类中的属性完全相同。只有在(1)不起作用时才尝试此方法
  • 或者,如果您真的想为JSON保留
    ,那么您需要读取单个JSON元素,然后使用JSON.NET(或类似工具)将其映射到您的
    列表

    例如,可以这样做的一种方法是将存储的proc更改为具有
    nvarchar(MAX)输出
    参数,您可以将该参数设置为查询结果。然后,调用代码可以读取该输出参数


    另一种方法是完全绕过实体框架,直接使用ADO.NET。调用,然后使用
    SqlDataReader.GetString(0)
    获取原始JSON。

    不是数据/内容问题。物理列架构与模型不匹配。请检查
    SELECT
    查询
    Get\u JSON\u MyItems
    并提供
    MyItem
    类内容,可能
    Id
    列不在其中。请稍候
    string.Concat
    返回带有串联值的新字符串,不能对字符串(必须是集合)使用
    ToList()
    。您应该使用
    List itemsJson=TabWebContext.Database.SqlQuery(“Get_JSON_MyItems”).ToList()改为。您的意思是MyItemModel.cs属性必须与数据库列@dlatikay绝对一致吗?但是我需要在不存在数据库列的模型中添加属性(以便在某些情况下在控制器中初始化它们)。但是当执行我问题中的查询时,该属性可以为null。MyItem和MyItemModel类是否具有相同的属性?