Массовая вставка documentdb с использованием tcp или хранимой процедуры в C#

Вот мой код C#

public static async Task<Database> GetDatabase(string databaseName)
{
        if (client.CreateDatabaseQuery().Where(db => db.Id ==
              databaseName).AsEnumerable().Any())
        {
            return client.CreateDatabaseQuery().Where(db => db.Id ==
               databaseName).AsEnumerable().FirstOrDefault();
        }
        return await client.CreateDatabaseAsync(new Database
        {
            Id = databaseName
        });
}

//check if collection already exists
public static async Task<DocumentCollection> GetCollection(Database database, string collName)
{
        if (client.CreateDocumentCollectionQuery
              (database.SelfLink).Where(coll => coll.Id ==
              collName).ToArray().Any())
        {
            return client.CreateDocumentCollectionQuery(database.SelfLink).
                  Where(coll => coll.Id ==
           collName).ToArray().FirstOrDefault();
        }
        return await client.CreateDocumentCollectionAsync(database.SelfLink, new DocumentCollection
        { Id = collName });
}

[Route("getHotelDetails")]
[HttpPost]
public HttpResponseMessage getHotelDetails(RootObj rootObj)
{
        var result = "";

        Database database = GetDatabase("sampledb").Result;

        DocumentCollection collection = GetCollection(database, "samplecollection").Result;          

        string convertListToJson = JsonConvert.SerializeObject(rootObj);   

        try
        {
            var url = "http://www.example.com";
            HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
            request.Method = "POST";
            request.ContentType = "application/json; encoding='utf-8'";
            request.Credentials = GetCredential();
            request.PreAuthenticate = true;
            using (var streamWriter = new StreamWriter(request.GetRequestStream()))
            {
                streamWriter.Write(convertListToJson);
                streamWriter.Flush();
            }
            var httpResponse = (HttpWebResponse)request.GetResponse();

            using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
            {
                result = streamReader.ReadToEnd();
            }
        }
        catch (WebException ex)
        {
            // Log exception and throw as for GET example above

            HttpResponseMessage resp = Request.CreateResponse(HttpStatusCode.ExpectationFailed, ex.Message.ToString());
            return resp;
        }

        RootObject obj = JsonConvert.DeserializeObject<RootObject>(result);
        HttpResponseMessage res = Request.CreateResponse(HttpStatusCode.OK, obj);
        return res;
}

private CredentialCache GetCredential()
{
        string url = @"http://www.example.com";
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
        CredentialCache credentialCache = new CredentialCache();
        credentialCache.Add(new System.Uri(url), "Basic", new NetworkCredential("xxx", "yyy"));
        return credentialCache;
}

И модель класса для параметра rootObj

public class HotelCriteria
{
    public string HotelCode { get; set; }
}

public class RoomRatePlans
{
    public HotelCriteria HotelCriteria { get; set; }
}

    public class RootObj
    {
        public string Version { get; set; }
        public string EchoToken { get; set; }
        public RoomRatePlans RoomRatePlans { get; set; }
    }

Конечный результат, который мне нужен, объясняется.

Итак, изначально я звоню во внешний API, чтобы получить информацию об отеле и их инвентарь, так что вот пример запроса и ответ, который я получаю после вызова внешнего API

Запрос как JSON:

{
   "Version": "1.2",
   "EchoToken": "879791878",
   "RoomRatePlans": {
  "HotelCriteria": {
     "HotelCode": "101920"
  }
  }
}

И ответ, который я получаю обратно

{
"HotelCriteria": {
    "HotelCode": "NONIDS",
    "HotelName": "TestThe Zuri Whitefield Bengaluru"
},
"RoomTypes": {
    "RoomTypeList": [
        {
            "InvTypeCode": "ZCR",
            "Name": "Zuri Club Room",
            "BaseOccupancy": 2,
            "MaxOccupancy": 3,
            "Quantity": 66,
            "IsRoomActive": 1,
            "RoomDescription": ""
        },
        {
            "InvTypeCode": "ZRR",
            "Name": "Zuri Room",
            "BaseOccupancy": 2,
            "MaxOccupancy": 3,
            "Quantity": 90,
            "IsRoomActive": 1,
            "RoomDescription": ""
        },
        {
            "InvTypeCode": "ZSR",
            "Name": "Zuri Suite Room",
            "BaseOccupancy": 2,
            "MaxOccupancy": 3,
            "Quantity": 4,
            "IsRoomActive": 1,
            "RoomDescription": ""
        }
    ]
},
"RatePlans": {
    "RatePlanList": [
        {
            "RatePlanCode": "B2C00001",
            "RatePlanCategory": "B2C",
            "RatePlanStatusType": 1,
            "RatePlanName": "Channel Rates",
            "Description": "Channel Rates",
            "InvTypeCode": "ZCR",
            "MealPlanCode": "CP",
            "MealPlanDesc": "Continental Plan",
            "Start": "2016-06-27",
            "End": "2017-03-31",
            "CurrencyCode": "INR"
        },
        {
            "RatePlanCode": "B2C00001",
            "RatePlanCategory": "B2C",
            "RatePlanStatusType": 1,
            "RatePlanName": "Channel Rates",
            "Description": "Channel Rates",
            "InvTypeCode": "ZRR",
            "MealPlanCode": "CP",
            "MealPlanDesc": "Continental Plan",
            "Start": "2016-06-27",
            "End": "2017-03-31",
            "CurrencyCode": "INR"
        },
        {
            "RatePlanCode": "B2C00001",
            "RatePlanCategory": "B2C",
            "RatePlanStatusType": 1,
            "RatePlanName": "Channel Rates",
            "Description": "Channel Rates",
            "InvTypeCode": "ZSR",
            "MealPlanCode": "CP",
            "MealPlanDesc": "Continental Plan",
            "Start": "2016-06-27",
            "End": "2017-03-31",
            "CurrencyCode": "INR"
        }
    ]
},
"Inclusions": {
    "InclusionList": [
        {
            "MealPlanCode": "CP",
            "MealPlanDesc": "Continental Plan"
        }
    ]
}
}

Модель класса для ответа я вернусь

        public class HotelCriteria
    {
        public string HotelCode { get; set; }
        public string HotelName { get; set; }
    }

    public class RoomTypeList
    {
        public string InvTypeCode { get; set; }
        public string Name { get; set; }
        public int BaseOccupancy { get; set; }
        public int MaxOccupancy { get; set; }
        public int Quantity { get; set; }
        public int IsRoomActive { get; set; }
        public string RoomDescription { get; set; }
    }

    public class RoomTypes
    {
        public List<RoomTypeList> RoomTypeList { get; set; }
    }

    public class RatePlanList
    {
        public string RatePlanCode { get; set; }
        public string RatePlanCategory { get; set; }
        public int RatePlanStatusType { get; set; }
        public string RatePlanName { get; set; }
        public string Description { get; set; }
        public string InvTypeCode { get; set; }
        public string MealPlanCode { get; set; }
        public string MealPlanDesc { get; set; }
        public string Start { get; set; }
        public string End { get; set; }
        public string CurrencyCode { get; set; }
    }

    public class RatePlans
    {
        public List<RatePlanList> RatePlanList { get; set; }
    }

    public class InclusionList
    {
        public string MealPlanCode { get; set; }
        public string MealPlanDesc { get; set; }
    }

    public class Inclusions
    {
        public List<InclusionList> InclusionList { get; set; }
    }

    public class RootObject
    {
        public HotelCriteria HotelCriteria { get; set; }
        public RoomTypes RoomTypes { get; set; }
        public RatePlans RatePlans { get; set; }
        public Inclusions Inclusions { get; set; }

    }

Итак, у меня есть список из 1500 отелей, для которых я буду вызывать API оставшихся, чтобы получить информацию о каждом отдельном отеле и его инвентарных деталях. В свою очередь, я хочу, чтобы каждый ответ сохранялся в documentdb в виде одного документа, поэтому в общей сложности у меня должно быть 1500 документов в моя коллекция. Так что, если я сделаю foreach и использую метод createocumentasync, это будет правильным выбором или я смогу массово вставлять записи после того, как все мои 1500 документов будут представлены в списке. Нужны ваши предложения и помощь!

Заранее спасибо!

1 ответ

Ваш код не является традиционным ado.net, но, на мой взгляд, я настоятельно рекомендую вам использовать bulkinsert, так как он предназначен для крупномасштабной вставки файлов / данных / документов. Вам просто нужно зациклить все 1500 документов, прежде чем вставлять сразу.

Другие вопросы по тегам