Bullgill Coder Ответов: 2

Отправка SQL-данных в WEB API в массиве JSON


Привет, я ищу несколько указателей для API, который я пишу. Цель с помощью API, чтобы отправить детали для внешней компании, поэтому форматирование результирующего JSON является фиксированной.

С этого мы и начнем...
[
  {
    "order_id": 1,
    "customer_no": 1,
    "items": [
      {
        "itemid": "12345",
        "qty": 1,
        "discount_amount": 20,
        "original_amount": 100,
        "total_amount": 80
      }
      {
        "itemid": "67890",
        "qty": 1,
        "discount_amount": 20,
        "original_amount": 100,
        "total_amount": 80
      }
    ],
    "grandtotal": 160,
    "createddate": "2020-08-26"
  }
  {
    "order_id": 2,
    "customer_no": 1,
    "items": [
      {
        "itemid": "12345",
        "qty": 1,
        "discount_amount": 20,
        "original_amount": 100,
        "total_amount": 80
      }
    ],
    "grandtotal": 80,
    "createddate": "2020-08-26"
  }
]

Поэтому, чтобы добраться до этой конечной точки, я могу быть довольно гибким. Мне удалось получить order_id, customer_no, grand_total и созданную дату, чтобы выйти в моем json, но ничего в разделе items.

Что я уже пробовал:

Это моя модель, которую я использовал, чтобы получить информацию заголовка для заказа...

public class readOrder : jsonOrder
{
    public readOrder(DataRow row)
    {
        order_id = row["order_id"].ToString();
        customer_no = row["customer_no"].ToString();
        //items.itemid= row["itemid"].ToString();
        grandtotal = Convert.ToDecimal(row["grandtotal"]);
        createddate = row["createddate"].ToString();

    }
}

public class jsonOrder
{
    public string order_id { get; set; }
    public string customer_no { get; set; }
    public orderitem items { get; set; }
    public decimal grandtotal { get; set; }
    public string createddate { get; set; }
}

public class orderitem
{
    public string itemid{ get; set; }
    public int qty { get; set; }
    public decimal discount_amount { get; set; }
    public decimal original_amount { get; set; }
    public decimal total_amount { get; set; }
}
и мой контроллер...
public HttpResponseMessage Get(string customer_no)
{
    _con = new SqlConnection(ConfigurationManager.ConnectionStrings["xxxx_Connection"].ConnectionString);

    // Get all orders
    DataTable ordHead = new DataTable();
    var queryHead = "Select * from ORDERHEADER where customer_no = " + customer_no;
    _Header_adapt = new SqlDataAdapter
    {
        SelectCommand = new SqlCommand(queryHead,_con)
    };
    _Header_adapt.Fill(ordHead);

    //Get items within orders
    DataTable ordDetail = new DataTable();
    var queryDetail = "Select * from ORDERHISTORY where customer_no = " + customer_no;
    _adapt = new SqlDataAdapter
    {
        SelectCommand = new SqlCommand(queryDetail, _con)
    };
    _adapt.Fill(ordDetail);

    List<readOrder> orderhistory = new List<Models.readOrder>(ordHead.Rows.Count);
    if (ordHead.Rows.Count > 0)
    {
        //var retd = new jsonOrder();
        //var jsonOrdHist = JsonConvert.SerializeObject(retd);
        foreach (DataRow orders in ordHead.Rows)
        {
            orderhistory.Add(new readOrder(orders));
        }
    }


    return Request.CreateResponse(HttpStatusCode.OK, orderhistory);
}
это дает мне результаты...
[
    {
        "order_id": "102535",
        "customer_no": "123",
        "items": null,
        "grand_total": 6.0000,
        "created_at": "08/07/2010 00:00:00"
    },
    {
        "order_id": "10929",
        "customer_12": "123",
        "items": null,
        "grand_total": 28.8000,
        "created_at": "28/03/2019 00:00:00"
    }
]


Что мне нужно сделать, чтобы заполнить раздел "элементы" массивом элементов.

Я могу отформатировать данные любым требуемым способом, то есть одно представление со всеми данными, или, как у меня есть на данный момент, одно представление с информацией заголовка и одно с деталями заказа. Это выход, который мне нужен, чтобы получить правильный.

Код немного неуклюжий, так как я весь день пробовал разные вещи!

Спасибо

--- ОБНОВЛЕНИЕ ---
Я потратил еще несколько часов на поиск в интернете некоторых подсказок для этого, но до сих пор не могу найти работоспособного решения, хотя это было бы то, что я считал бы обычно используемой задачей?

2 Ответов

Рейтинг:
6

Bullgill Coder

Возможно, немного неуклюже, но теперь у меня есть кое-что, что работает.

public HttpResponseMessage Get(string customer)
        {
            _con = new SqlConnection(ConfigurationManager.ConnectionStrings["Connection"].ConnectionString);
            
            string queryString = "Select * from ORDERHEADER where customer = " + customer;

            DataSet ordetails = new DataSet();
            DataSet ordetailssub = new DataSet();
            var q_Head = "Select * from ORDERHEADER where customer = " + customer;
            _Header_adapt = new SqlDataAdapter
            {
                SelectCommand = new SqlCommand(q_Head, _con)
            };
            _Header_adapt.Fill(ordetails,"ORDERHEADER");
            
            var q_Detail = "Select * from ORDERDETAIL where customer = " + customer;
            SqlDataAdapter _Det_adapt = new SqlDataAdapter
            {
                SelectCommand = new SqlCommand(q_Detail, _con)
            };
            _Det_adapt.Fill(ordetails, "ORDERDETAIL");

            DataRelation ordRel = ordetails.Relations.Add("x",
                ordetails.Tables["ORDERHEADER"].Columns["Order"],
                ordetails.Tables["ORDERDETAIL"].Columns["Order"]);

            SqlDataAdapter custAdapter = 
                new SqlDataAdapter("Select * from ORDERHEADER where customer = " + customer, _con);
            SqlDataAdapter ordAdapter = new SqlDataAdapter("Select * from ORDERDETAIL where customer_urn = " + customer, _con);

            DataSet customerOrders = new DataSet();

            var jsonorderlist = new List<jsonOrder>();
            var oh3 = new jsonOrder() { };
            foreach (DataRow pRow in ordetails.Tables["ORDERHEADER"].Rows)
            {
                var ord = new jsonOrder()
                {
                    order = pRow["order"].ToString(),
                    customer = pRow["Customer"].ToString(),
                    total = Convert.ToDecimal(pRow["total"]),
                };
                int key1 = 0;
                foreach (DataRow cRow in pRow.GetChildRows(ordRel))
                {
                    key1 = key1 + 1;
                    ord.itemsordered.Add(key1.ToString(), new jsonOrder.orderitem
                    {
                        product= cRow["product"].ToString(),
                        qty = Convert.ToInt32(cRow["qty"]),
                        total_amount = Convert.ToDecimal(cRow["total_amount"])
                    });
                }
                //ord.grand_total = Convert.ToDecimal(pRow["total"]);
                jsonorderlist.Add(ord);
 
            }

            return Request.CreateResponse(HttpStatusCode.OK, jsonorderlist);
        }

    }


Рейтинг:
0

Bullgill Coder

Я смотрел в ту сторону. Пример microsoft просто дает мне то, чего я уже достиг. Как я справляюсь с массивом внутри массива, как я это сделал?

Gerry Schmitz

У вас есть 2 элемента; это не "массив внутри массива", а скорее список"объект".

Bullgill Coder

Спасибо, я принял массив, так как у меня был набор заказов, а затем внутри каждого заказа - набор продуктов. Как вы можете видеть, я использовал список и сумел решить эту проблему. Мне не нужно, чтобы сериализовать.