从ASP.NET Core中的存储过程获取Json的重构方法

Refactoring method for getting Json from a stored procedure in ASP.NET Core

拜托,请不要关闭或将此问题标记为重复,我已经查看了 Whosebug 和在线但找不到解决方案。

下面的代码非常有效,我通过存储过程从 SQL 服务器接收数据,然后分配给书籍模型列表和 return Json:

public IActionResult GetAllBooks()
{
    List<BookViewModel> book = new List<BookViewModel>();

    DataTable dataTable = new DataTable();

    using (SqlConnection sqlConnection = new SqlConnection(_configuration.GetConnectionString("xxx")))
    {
        sqlConnection.Open();

        SqlDataAdapter sqlData = new SqlDataAdapter("proc_GetBookList", sqlConnection);
        sqlData.SelectCommand.CommandType = CommandType.StoredProcedure;

        sqlData.Fill(dataTable);

        foreach (DataRow dr in dataTable.Rows)
        {
            book.Add(new BookViewModel
            {
                Name = dr["Name"].ToString(),
                Stock = Convert.ToInt32(dr["Stock"]),
             });
         }
     }

     return Json(book);
}

但我正在尝试寻找更好的方法或最佳实践,例如序列化或任何其他技术,这样我就不需要像下面这样创建(查看模型并为其分配值)。这是只有两个属性的小例子,但有时我需要映射 20 个或更多属性,你们在上面的代码中看到任何问题了吗?我是软件开发领域的新手,如有任何建议,我们将不胜感激。

new BookViewModel
{
    Name = dr["Name"].ToString(),
    Stock = Convert.ToInt32(dr["Stock"]),
};

为此我使用了 Newtonsoft JSON(NuGet 包)。

示例:

using Newtonsoft.JSON;  
  
public string DataTableToJSONWithJSONNet(DataTable table) {  
   string JSONString = string.Empty;  
   JSONString = JSONConvert.SerializeObject(table);  
   return JSONString;  
} 

您可以找到这个 Newtonsoft 示例和一些其他方法 here

像您正在使用的那样使用查询很可能会让您使用这种赋值方式。切换到 Entity Framework 来查询您的数据库将是您最好的选择,因为它会自动分配给 objects/classes。但我知道在项目开始后这样做可能是 PITA 或几乎不可能(或非常大量的工作)。还有一点学习曲线,如果你以前从未使用过它。

为了让事情变得更简单,您可以做的是为您的模型创建一个构造函数,该构造函数接收 DataRow 并将数据分配到一个地方。

public BookViewModel(DataRow dr)
{
    Name = dr["Name"].ToString();
    Stock = Convert.ToInt32(dr["Stock"]);
}

然后你只需调用“book.Add(new BookViewModel(dr));”在你的 foreach 循环中。如果您必须在代码中的多个位置执行此操作,则此方法很有效,因此您不必在导入行时重复分配。

您也许还可以使用 Reflection 自动为您分配值。这也有一点学习曲线,但它可以使转换更简单,当你设置它时。

与 Reflection 类似的东西是 AutoMapper,但它不像以前那么流行了。

我打算建议使用像 Newtonsoft 或 built in package for C# 这样的 JSON 软件包,但看起来我被打败了。

另一个选项是使用 Dapper。它是您当前系统和实体之间的半步。它可以使用 SQL 或它自己的查询语言将结果直接转换为模型。这可能是重构代码的最简单、最直接的方法。

Dapper 和 Entity 是对象关系映射器 (ORM) 的示例。身边还有人可以看看

我只列出了我实际使用过的方法,还有许多其他方法可以完成同样的事情,即使没有 ORM。它们各有优缺点,因此请您进行研究以找出您愿意承诺的内容。

只需将您的“return Json(book)”替换为

return 好的(书)