2017-03-20 6 views
0

は、ここに私のC#のコード一括挿入C#でtcpまたはストアドプロシージャを使用してdocumentdb

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; } 
    } 

最終結果のためのモデルクラスです。

{ 
    "Version": "1.2", 
    "EchoToken": "879791878", 
    "RoomRatePlans": { 
    "HotelCriteria": { 
    "HotelCode": "101920" 
    } 
    } 
} 
:だから、最初は私はので、ここでホテルの詳細とそのインベントリを取得するには、外部APIを呼び出しています

はサンプル要求と応答は、私は外部のAPIにJSONとして

要求を呼び出した後取り戻すことです

そして、私は

{ 
"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; } 

    } 

私は残りのAPIをそれぞれのホテルと在庫の詳細を取得するために私は1500ホテルのリストを持っています。順番に、私は個々のドキュメントとしてdocumentdbに保存される各回答を合計したい私はあなたのforeachを使用し、createdocumentasyncメソッドを使用すると適切な選択になるか、リスト内のすべての1500文書の詳細を持つ一括レコードを挿入することができます。あなたの提案や助けを必要とする!

ありがとうございます!

答えて

0

あなたのコードは従来のado.netではありませんが、私の意見では、ファイル/データ/ドキュメントの大規模な挿入用に設計されているので、bulkinsertを使用することを強くお勧めします。一度に挿入する前に、すべての1500のドキュメントをループするだけで済みます。

+0

forループを使用してリストに追加し、一括挿入しますか? BTWこれはado.netではありません。私は、C#Web API 2でazure documentdbを使用しています。 – Melvin

+0

はい、まさに!私はweb api 2を使用していませんが、asmxのみですが、従来のado.netはmvc/web apiでも使用できますが、使用するのが快適なところからとどまります。同じ論理/アプローチ –

関連する問題