从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 好的(书)
拜托,请不要关闭或将此问题标记为重复,我已经查看了 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 好的(书)