【问题标题】:How to get name data of multiple json object list that will be posted to web api?如何获取将发布到 Web api 的多个 json 对象列表的名称数据?
【发布时间】:2015-05-13 20:58:56
【问题描述】:

我在 Web API ASP.NET 中有一个接受单个 Json 对象的 post 方法。这是带有代码的代码,用于检查来自发布 Json 的数据是否存在于我的数据库中。我将使用 Linq 与我的数据库进行交互。 Sales_ 是在我的上下文中自动生成的,我相信来自 EntityFramework。 db 是我的数据库对象。

public HttpResponseMessage PostSales(Sales Sales, [FromUri] string auth)
        {
            try
            {
                if (ModelState.IsValid)
                {                    
                    if (auth == "KDI")
                    {

                        Int64 rs = db.Sales_.Where(sl => sl.Serial == Sales.Serial).Count();
                        if (rs == 1)
                        {
                            return Request.CreateErrorResponse(HttpStatusCode.Conflict, " Duplicate Found!");
                        }
                        else
                        {
                            db.Sales_.Add(Sales);
                            db.SaveChanges();
                            return Request.CreateErrorResponse(HttpStatusCode.OK, "Added!");
                        }
//Closing elses cut out for this question.

这工作正常,它接受我的 Json 罚款作为单个对象。

这是我将发布的 Json。

{
  "Serial": 1,
  "ExtSerial": "AH0000002",
  "Date": "2015-03-01",
  "CustomerRefNbr": "JPM0001",
  "Description": "2015 FEBRUARY RENTAL  2015 FEBRUARY RENTAL",
  "Customer": "TRDE0065",
  "Amount": 17989.51,
  "AQ_Branch": "KDI",
  "AQ_COA": "4100503000",
  "LineSubAccount": "OPMOPN000",
  "LineTaxCategory": "JPMTAX",
  "LineQuantity": 1,
  "LineUnitPrice": 400000,
  "AQ_PostStatus": 1,
  "AQ_StatusDate": "2015-03-01",
  "DTS": "2015-03-01",
  "LineDescription": "Line Description"
}

现在,我想在一个 json 对象中发布多个列表或行(不知道如何称呼它们)。像这样的:

    {
      "ExtSerial": "AH0000002",
      "Date": "2015-03-01",
      "CustomerRefNbr": "JPM0001",
      "Description": "2015 FEBRUARY RENTAL  2015 FEBRUARY RENTAL",
      "Customer": "TRDE0065",
      "Amount": 17989.51,
      "AQ_Branch": "KDI",
      "AQ_COA": "4100503000",
      "LineSubAccount": "OPMOPN000",
      "LineTaxCategory": "JPMTAX",
      "LineQuantity": 1,
      "LineUnitPrice": 400000,
      "AQ_PostStatus": 1,
      "AQ_StatusDate": "2015-03-01",
      "DTS": "2015-03-01",
      "LineDescription": "Line Description"
    },{
      "ExtSerial": "AH0000003",
      "Date": "2015-04-01",
      "CustomerRefNbr": "JPM0002",
      "Description": "2015 FEBRUARY RENTAL  2015 FEBRUARY RENTAL",
      "Customer": "TRDE0066",
      " Amount": 17989.51,
      "AQ_Branch": "KDI",
      "AQ_COA": "4100503000",
      "LineSubAccount": "OPMOPN000",
      "LineTaxCategory": "JPMTAX",
      "LineQuantity": 2,
      "LineUnitPrice": 400000,
      "AQ_PostStatus": 1,
      "AQ_StatusDate": "2015-04-01",
      "DTS": "2015-04-01",
      "LineDescription": "Line Description"
}

但不确定在我的 post 方法中会如何阅读。我尝试将参数 Sales 更改为 List<Sales> Sales。我认为这是用于对象中的列表的内容,但我的问题是我的 db.Sales_.Add(Sales); 现在正在产生错误。 (无效参数)不确定如何将 .Add() 与列表一起使用。另外,我无法获取我的销售表列序列的数据,如Int64 rs = db.Sales_.Where(sl => sl.Serial == Sales.Serial).Count();所示

我几乎被卡住了,不知道该怎么做。我希望你不要觉得我的问题很愚蠢。我只是需要你的帮助。我知道这是一个简单的解决方法。

【问题讨论】:

    标签: c# json linq entity-framework asp.net-web-api


    【解决方案1】:

    JSON 数组包含在 [] 中,您的 Sales 参数也必须是列表或数组。

    将您的方法签名更改为

    public HttpResponseMessage PostSales(List<Sales> Sales, [FromUri] string auth)
    

    将您的 json 更改为 [] 之类的包装

    [{
          "ExtSerial": "AH0000002",
          "Date": "2015-03-01",
          "CustomerRefNbr": "JPM0001",
          "Description": "2015 FEBRUARY RENTAL  2015 FEBRUARY RENTAL",
          "Customer": "TRDE0065",
          "Amount": 17989.51,
          "AQ_Branch": "KDI",
          "AQ_COA": "4100503000",
          "LineSubAccount": "OPMOPN000",
          "LineTaxCategory": "JPMTAX",
          "LineQuantity": 1,
          "LineUnitPrice": 400000,
          "AQ_PostStatus": 1,
          "AQ_StatusDate": "2015-03-01",
          "DTS": "2015-03-01",
          "LineDescription": "Line Description"
        },{
          "ExtSerial": "AH0000003",
          "Date": "2015-04-01",
          "CustomerRefNbr": "JPM0002",
          "Description": "2015 FEBRUARY RENTAL  2015 FEBRUARY RENTAL",
          "Customer": "TRDE0066",
          " Amount": 17989.51,
          "AQ_Branch": "KDI",
          "AQ_COA": "4100503000",
          "LineSubAccount": "OPMOPN000",
          "LineTaxCategory": "JPMTAX",
          "LineQuantity": 2,
          "LineUnitPrice": 400000,
          "AQ_PostStatus": 1,
          "AQ_StatusDate": "2015-04-01",
          "DTS": "2015-04-01",
          "LineDescription": "Line Description"
    }]
    

    现在您只需枚举您的Sales 并单独处理每一个。类似的东西

    Parallel.ForEach(Sales, sale => {
    //you can clean this up using Any(), instead of Where.. 
    //Int64 rs = db.Sales_.Where(sl => sl.Serial == sale.Serial).Count();
        using (var dbContext = new YourDatabaseContext())
        {
                            if (dbContext .Sales_.Any(sl => sl.Serial == sale.Serial))
                            {
                                return;  //ignore duplicates
                            }
                            else
                            {
                                dbContext .Sales_.Add(sale);
                                dbContext .SaveChanges();
                            }
        }
    });
    return Request.CreateErrorResponse(HttpStatusCode.OK, "Finished");
    //you can just return OK considering a duplicate will not break the client.
    

    【讨论】:

    • 嗨,我在 if 语句中遇到异常:EntityFramework.dll 中发生“System.InvalidOperationException”类型的异常,但未在用户代码中处理其他信息:无法使用上下文在创建模型时。如果在 OnModelCreating 方法中使用上下文,或者多个线程同时访问同一个上下文实例,则可能会引发此异常。请注意,不保证 DbContext 和相关类的实例成员是线程安全的。
    • 我更新了我的代码以在 Parallel.ForEach 中创建数据库上下文 如果您的 json 数组只有几个对象,那么最好不要在 Parallel.ForEach 中创建数据库上下文只需使用常规的同步 foreach。如果您的 json 数组可以是 100 个,您应该考虑将 MaxDegreeOfParallelism 选项添加到 Parallel.ForEach
    猜你喜欢
    • 2015-03-22
    • 1970-01-01
    • 2015-07-09
    • 1970-01-01
    • 2019-12-09
    • 2020-08-14
    • 1970-01-01
    • 2016-05-27
    • 1970-01-01
    相关资源
    最近更新 更多