請不要關閉或將此問題標記為重復,我已經查看了 StackOverflow 和在線但找不到解決方案。
下面的代碼效果很好,我通過存盤程序從 sql 接收資料,然后分配給書籍模型串列并回傳 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"]),
};
uj5u.com熱心網友回復:
為此,我使用了 Newtonsoft JSON(NuGet 包)。
例子:
using Newtonsoft.JSON;
public string DataTableToJSONWithJSONNet(DataTable table) {
string JSONString = string.Empty;
JSONString = JSONConvert.SerializeObject(table);
return JSONString;
}
您可以在此處找到這個 Newtonsoft 示例和其他一些方法。
uj5u.com熱心網友回復:
使用您正在使用的查詢幾乎會讓您使用這種分配方式。切換到物體框架來查詢你的資料庫將是你最好的選擇,因為它會自動分配給物件/類。但我知道在專案啟動后這樣做可能是 PITA 或幾乎不可能(或非常大量的作業)。如果您以前從未使用過它,那么還有一點學習曲線。
您可以做的讓事情變得更簡單的是為您的模型創建一個建構式,該建構式接收 aDataRow并將資料分配到一個地方。
public BookViewModel(DataRow dr)
{
Name = dr["Name"].ToString();
Stock = Convert.ToInt32(dr["Stock"]);
}
然后你只需呼叫“book.Add(new BookViewModel(dr));” 在你的foreach回圈中。如果您必須在代碼中的多個位置執行此操作,這將非常有效,因此您在匯入行時不必重復分配。
您也許還可以使用Reflection自動為您分配值。這也有一些學習曲線,但是當您設定好它時,它可以使轉換變得更加簡單。
類似于 Reflection 的是AutoMapper,但它不像以前那么流行了。
我打算建議使用像 Newtonsoft 這樣的 JSON 包或C#的內置包,但看起來我被打敗了。
另一種選擇是使用Dapper。這是您當前系統和物體之間的半步。它可以使用 SQL 或其自己的查詢語言將結果直接轉換為模型。這可能是重構代碼的最簡單、最直接的方法。
Dapper 和 Entity 是物件關系映射器 (ORM) 的示例。你周圍還有其他人可以去看看。
我只列出了我實際使用過的方法,還有很多其他方法可以完成相同的事情,即使沒有 ORM。它們都有其優點和缺點,因此請進行研究以找出您愿意承諾的內容。
uj5u.com熱心網友回復:
只需將您的“回傳 Json(book)”替換為
回傳 Ok(書)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/360506.html
標籤:C# 网站 asp.net核心 asp.net-core-3.1
上一篇:如何洗掉<string,list<Items>>字典的Item
下一篇:具有多種資料型別的串列
