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

Вот мой код С#

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, чтобы получить каждый отдельный отель и информацию об их инвентаре. моя коллекция. Так что, если я сделаю foreach и использую метод createdocumentasync, будет ли это правильным выбором, или я могу массово вставлять записи после того, как все мои 1500 деталей документа будут в списке. Нужны ваши предложения и помощь!

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


person Melvin    schedule 20.03.2017    source источник


Ответы (1)


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

person Francis Saul    schedule 20.03.2017
comment
Итак, используйте цикл for и добавьте их в список, а затем выполните массовую вставку? Кстати, это не ado.net, я использую azure documentdb с С# Web API 2. - person Melvin; 20.03.2017
comment
Да, точно! Я не использовал веб-API 2, только asmx, но традиционный ado.net все еще можно использовать в mvc/web API, однако просто придерживайтесь того места, где вам удобно использовать. та же логика/подход - person Francis Saul; 20.03.2017