【问题标题】:Populate an object from multiple sql queries从多个 sql 查询中填充一个对象
【发布时间】:2020-08-27 12:25:01
【问题描述】:

我只是在寻找一些指导,让我走上正确的道路。我有 2 个 SQL 查询,一个返回客户列表,一个返回客户已下订单的列表。在 c# 中工作,我如何能够填充一个可以序列化为 json 的类。

我尝试了多种不同的方式,现在这是我班级最接近的方式......

public class jsonOrder
    {     
        public string order_no { get; set; }
        public string customer { get; set; }
        public List<orderitem> items { get; set; }
        public decimal grandtotal { get; set; }
        public jsonOrder()
        {
            this.items = new List<orderitem>();
        }        
    }

    public class orderitem
    {
        public string itemcode{ get; set; }
        public int quantity { get; set; }
        public decimal amount { get; set; }
    }

使用这个我可以让我的 json 看起来像这样......

[
    {
        "order_no": "12345",
        "customer": "12",
        "items": [],
        "grand_total": 6.0000,
    }
    {
        ...another order...
    }
]

如何让物品按顺序列出时间?

例如

{
        "order_no": "12345",
        "customer": "12",
        "items": [
                      {"itemcode":"a","quantity":1,"amount":12.34}
                      {"itemcode":"b","quantity":2,"amount":6.12}
                 ],
        "grand_total": 24.5800
}

目前我的代码是

List<readOrder> orderhistory = new List<Models.readOrder>(ordHead.Rows.Count);
            if (ordHead.Rows.Count > 0)
            {
                foreach (DataRow orders in ordHead.Rows)
                {
                    orderhistory.Add(new readOrder(orders));
                }
            }

但这只是带回标题详细信息。

我目前从以下获取我的 SQL,但我对此很灵活......

_con = new SqlConnection(ConfigurationManager.ConnectionStrings["Connection"].ConnectionString);
            
// Get all orders
   DataTable ordHead = new DataTable();
   var queryHead = "Select * from ORDERHEADER where customer = " + customer;
   _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 = " + customer;
            _adapt = new SqlDataAdapter
            {
                SelectCommand = new SqlCommand(queryDetail, _con)
            };
            _adapt.Fill(ordDetail);
    ```

【问题讨论】:

  • 如果我们的帖子对您​​有帮助,那么您至少需要给我们一票。

标签: c# json list object


【解决方案1】:

你可以尝试这样“伪造”:

internal class Program
{
    private static void Main(string[] args)
    {
        Console.WriteLine("Hello World!");
        var jo = new jsonOrder()
        {
            customer = "cust",
            order_no = "123"
        };

        jo.itemsOrdered.Add("cdf", new jsonOrder.orderitem
        {
            amount = 1,
            itemcode = "cdf",
            quantity = 10
        });
        jo.itemsOrdered.Add("abc", new jsonOrder.orderitem
        {
            amount = 1,
            itemcode = "abc",
            quantity = 10
        });

        Console.WriteLine(JsonConvert.SerializeObject(jo));
        Console.ReadKey();
    }
}

internal class jsonOrder
{
    public jsonOrder()
    {
        this.itemsOrdered = new SortedList<string, orderitem>();
    }

    public string customer { get; set; }

    public decimal grandtotal { get; set; }


    [JsonIgnore]
    public SortedList<string, orderitem> itemsOrdered 
    {
        get;set;
    }

    public List<orderitem> items
    {
        get { return itemsOrdered.Values.ToList(); }
    }        

    public string order_no { get; set; }

    public class orderitem
    {
        public decimal amount { get; set; }

        public string itemcode { get; set; }

        public int quantity { get; set; }
    }
}

【讨论】:

  • 谢谢,不过我需要从 SQL 查询中填充“jo”。有没有一种简单(或复杂)的方法来实现这一目标?
  • 您没有说您是如何从 SQL 数据库中读取数据的。你使用任何 ORM 吗?如果没有,您可以使用 SqlDataReader 并手动映射/填充字段 (docs.microsoft.com/en-us/dotnet/api/…) 或使用 DataSets (docs.microsoft.com/en-us/dotnet/framework/data/adonet/…)。
  • 我对如何填充数据很灵活,最终结果是重要的一点。我已将如何获取我的 SQL 添加到原始问题中。
  • @KevinRobinson 你能把 readOrder 的类代码和你如何将 readOrder 映射到 jsonOrder 上来吗
【解决方案2】:

试试下面的方法,并检查this 会帮助你。

public class jsonOrder
{     
    public string order_no { get; set; }
    public string customer { get; set; }
    public List<orderitem> items { get; set; }
    public decimal grandtotal { get; set; }
    public jsonOrder()
    {
        this.items = new List<orderitem>();
    }        
}

public class orderitem
{
    public string itemcode{ get; set; }
    public int quantity { get; set; }
    public decimal amount { get; set; }
}

public class Program
{
      static public void Main()
      {
             using (StreamReader r = new StreamReader(Server.MapPath("pass_your_json")))
             {
                  string json = r.ReadToEnd();
                   List<jsonOrder> jsonObject = JsonConvert.DeserializeObject<List<jsonOrder>>(json);
             }

         Console.WriteLine(jsonObject[0].orderitem[0].itemcode);                 
      }  
}

【讨论】:

  • 谢谢,你把“pass_you_json”放在哪里你是什么意思?我正在尝试从两个 SQL 查询中填充数据,然后我假设我必须使用 JsonConvert.SerializeObject 来获取我的输出。
  • @KevinRobinson 您必须将您的 json 分配给字符串变量并将其传递给那里
【解决方案3】:

我已经设法解决了...我更正的代码如下。感谢那些为我指出我需要看的方向的人......

public HttpResponseMessage Get(string customer_urn)
        {
            _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 = " + 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_id = pRow["order"].ToString(),
                    customer_urn = 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
                    {
                        prod = cRow["prod"].ToString(),
                        qty = Convert.ToInt32(cRow["qty"]),
                        total_amount = Convert.ToDecimal(cRow["total_amount"])
                    });
                }
                jsonorderlist.Add(ord);
 
            }

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

    }

【讨论】:

    猜你喜欢
    • 2019-10-04
    • 2013-07-30
    • 2018-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-21
    • 1970-01-01
    相关资源
    最近更新 更多