我要做的是從我的資料庫中獲取一些資料(客戶訂購了他訂購的所有物品)將其轉換為包含所述物品串列的 JSON,以便我可以通過 POST 請求發送它。我想創建一個 JSON 物件,其中包含客戶訂單的詳細資訊以及該訂單中包含的產品串列。這就是我希望我的 JSON 的樣子:
{
"account_code": "00000",
"advance_payment": false,
"date": [today's date],
"order_items":
[
{
"item_id": 0,
"product_Price ": "105.00",
"order_Item_Rebate: "",
"product_code": "000001",
"quantity": 1
},
{
"item_id": 1,
"product_Price ": "55.00",
"price": "",
"product_code": "000002",
"quantity": 5
},
{
"item_id": 2,
"product_Price ": "15.00",
"price": "",
"product_code": "000003",
"quantity": 3
}
]
}
但我得到的是:
{
"account_code": "00000",
"advance_payment": false,
"date": [today's date],
"order_items":
[
{
"item_id": 0,
"roduct_Price ": "105.00",
"order_Item_Rebate: "",
"product_code": "000001",
"quantity": 1
}
]
},
{
"account_code": "00000",
"advance_payment": false,
"date": [today's date],
"order_items":
[
{
"item_id": 1,
"roduct_Price ": "55.00",
"price": "",
"product_code": "000002",
"quantity": 5
}
]
},
{
"account_code": "00000",
"advance_payment": false,
"date": [today's date],
"order_items":
[
{
"item_id": 2,
"product_Price ": "15.00",
"price": "",
"product_code": "000003",
"quantity": 3
}
]
}
我為同一個客戶(account_code)獲得了多個 JSON 物件,而不是一個帶有專案串列的 JSON 物件。
I'm getting this data from database using ADO.NET and I read this data with SqlDataReader. Inside SqlDataReader I created a new object and filled it with details about my order. It all works, but problem is order_items which should be a list of all items from the order. I want one order with multiple items in it, not a different order for every item. Using code below I am able to get data from my database, but I don't know how to group order_items with the order they should be in.
List<OrderModel> orderList = new List<OrderModel>();
using (SqlDataReader rdr = await cmd.ExecuteReaderAsync())
{
while (rdr.Read())
{
OrderModel order = new OrderModel()
{
Account_code = rdr[0].ToString(),
Advance_payment = false,
Date = DateTime.Now.Date,
Order_Items = new List<Order_items>()
{
//Here is where I should do something instead of creating new
//Order_items, but I don't know what
new Order_items()
{
Order_Item_Rebate = rdr[1].ToString(),
Product_Price = rdr[2].ToString(),
Product_Code = rdr[3].ToString(),
Quantity = rdr[4].ToString()
}
}
};
orderList.Add(order);
}
var jsonString = JsonConvert.SerializeObject(orderList);
return jsonString;
}
My OrderModel class looks like this:
public class OrderModel
{
public string Account_code { get; set; }
public bool Advance_payment { get; set; }
public DateTime Date { get; set; }
public List<Order_items> Order_Items { get; set; }
}
public class Order_items
{
public string Order_Item_Rebate { get; set; }
public string Product_Price { get; set; }
public string Product_Code { get; set; }
public string Quantity { get; set; }
}
And table from my database looks like this:
| Account_code | Order_Item_Rebate | Product_Price | Product_Code | Quantity |
|---|---|---|---|---|
| 00000 | 10 | 105 | 000001 | 1 |
| 00000 | 5 | 55 | 000002 | 5 |
| 00000 | 15 | 15 | 000002 | 3 |
我看到過類似的問題,人們建議使用一系列字典,但我不確定我是否理解它們將如何提供幫助。我是新手,所以如果問題不是很聰明,我很抱歉。
uj5u.com熱心網友回復:
SQL查詢會產生“扁平化”的資料,所以需要自己分組。沿著這條線的東西:
var orderDict = new Dictionary<string, OrderModel>(); // mapping from account code to order object
while (rdr.Read())
{
var accCode = rdr[0].ToString();
// if no object previously added - add a new one
if(!orderDict.TryGetValue(accCode, out var order))
{
order = new OrderModel()
{
Account_code = accCode ,
Advance_payment = false,
Date = DateTime.Now.Date,
Order_Items = new List<Order_items>()
};
orderDict[accCode] = order;
}
// add details from current result line to order
order.Order_Items.Add(new Order_items() {...});
}
var jsonString = JsonConvert.SerializeObject(orderDict.Values); // serialize only values, not the whole dictionary
uj5u.com熱心網友回復:
所以,問題是你在回圈OrderModel的每次迭代中都創建了一個新的while (rdr.Read())。解決此問題的最直接方法是簡單地檢查基于 的現有in OrderModel,并僅在找不到時創建一個新實體。例如...orderListAccount_codeOrderModel
List<OrderModel> orderList = new List<OrderModel>();
using (SqlDataReader rdr = await cmd.ExecuteReaderAsync())
{
while (rdr.Read())
{
// Check to see if there is already an instance of OrderModel with the
// account code in the list.
OrderModel order = orderList.FirstOrDefault(om => om.Account_code == rdr[0].ToString());
if (order == null)
{
// If there isn't create a new instance of OrderModel and add it to
// the list.
order = new OrderModel
{
Account_code = rdr[0].ToString(),
Advance_payment = false,
Date = DateTime.Now.Date,
Order_Items = new List<Order_items>()
};
orderList.Add(order);
}
// Now, just add the new item to Order_Items.
order.Order_Items.Add(new Order_item
{
Order_Item_Rebate = rdr[1].ToString(),
Product_Price = rdr[2].ToString(),
Product_Code = rdr[3].ToString(),
Quantity = rdr[4].ToString()
});
}
var jsonString = JsonConvert.SerializeObject(orderList);
return jsonString;
}
性能可能會很差,尤其是在orderList變大時,因為orderList每次回圈迭代都會迭代一次while。但是,這種基本方法應該有效。您需要確保只在結果集中創建一個,而不是OrderModel在回圈的每次迭代中創建一個。whileAccount_code
如果您可以控制查詢本身,則可以對結果進行排序Account_code以解決性能問題。
List<OrderModel> orderList = new List<OrderModel>();
using (SqlDataReader rdr = await cmd.ExecuteReaderAsync())
{
OrderModel order = null;
while (rdr.Read())
{
if (order == null || order.Account_code != rdr[0].ToString())
{
// The order is null, meaning that this is the first order model to be processed.
// Or, the order's account code is different than the current account code on the result set, meaning we have begun processing a new order.
// In either case, you need to add a new order to the list so
// you can start filling in its items.
order = new OrderModel
{
Account_code = rdr[0].ToString(),
Advance_payment = false,
Date = DateTime.Now.Date,
Order_Items = new List<Order_items>()
};
orderList.Add(order);
}
// Now, just add the new item to Order_Items.
order.Order_Items.Add(new Order_item
{
Order_Item_Rebate = rdr[1].ToString(),
Product_Price = rdr[2].ToString(),
Product_Code = rdr[3].ToString(),
Quantity = rdr[4].ToString()
});
}
var jsonString = JsonConvert.SerializeObject(orderList);
return jsonString;
}
僅當您可以按帳戶代碼對查詢結果進行排序時,上述方法才有效。
uj5u.com熱心網友回復:
- 在回圈外定義
order變數。while
var order = new OrderModel()
{
Account_code = rdr[0].ToString(),
Advance_payment = false,
Date = DateTime.Now.Date,
Order_Items = new List<Order_items>()
};
- 決議
while回圈內的訂單項
using (SqlDataReader rdr = await cmd.ExecuteReaderAsync())
{
while (rdr.Read())
{
var item = new Order_items()
{
Order_Item_Rebate = rdr[1].ToString(),
Product_Price = rdr[2].ToString(),
Product_Code = rdr[3].ToString(),
Quantity = rdr[4].ToString()
};
order.Order_Items.Add(item);
}
}
- 僅
OrderModel在回圈之后序列化
var jsonString = JsonConvert.SerializeObject(order);
return jsonString;
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/457348.html
