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

Posted

技术标签:

【中文标题】ASP.NET Core从存储过程中获取Json的重构方法【英文标题】:Refactoring method for getting Json from a stored procedure in ASP.NET Core 【发布时间】:2021-12-27 23:26:48 【问题描述】:

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

下面的代码效果很好,我通过存储过程从 SQL Server 接收数据,然后分配给书籍模型列表并返回 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"]),
;

【问题讨论】:

您的代码和任何代码一样好。如果您不熟悉软件开发 - 您需要学习 Entity Framework,并使用它来代替无类型数据库访问。但是您仍然需要创建 ViewModel - 这是一件的事情!您可能已经看过 Stack Overflow 和在线 - 但我不知道您在寻找什么解决方案? 这对你有很大帮助 - entityframeworktutorial.net/efcore/… 【参考方案1】:

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

例子:

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

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

【讨论】:

谢谢,效果很好【参考方案2】:

使用您正在使用的查询几乎会让您使用这种分配方式。切换到Entity Framework 来查询您的数据库将是您最好的选择,因为它会自动分配给对象/类。但我知道在项目开始后这样做可能是一个 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。它们都有其优点和缺点,因此请进行研究以确定您愿意承诺什么。

【讨论】:

【参考方案3】:

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

返回确定(书)

【讨论】:

以上是关于ASP.NET Core从存储过程中获取Json的重构方法的主要内容,如果未能解决你的问题,请参考以下文章

在 ASP.Net Core 项目中使用 ADO.Net 将 JSON 类型作为参数传递给 SQL Server 2016 存储过程

ASP.NET Core中如何使用缓存

从 ASP.net Core 2 MVC 应用程序中的 appSettings.json 存储/检索 ConnectionString

ASP.NET Core 中的加密配置

在 ASP.Net Core 中实现 ADO 连接

如何使用 MongoDB 将动态 JSON 属性发布到 C# ASP.Net Core Web API?