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 2 MVC 应用程序中的 appSettings.json 存储/检索 ConnectionString