2016-09-13 3 views
1

내 모델의 한 항목으로 작업 할 때 나는 Transaction with ArnagoDB_NET에서 일했습니다. 내 모델 목록을 전달하려고 할 때 문제가 있습니다. 예를 들어 위의내 모델의 목록을 ArangoDB-NET의 Transaction에 전달하십시오.

var transactionResult= Context.Transaction.WriteCollection("User").Execute<Dictionary<string, object>>(
    string.Format(@" 
    function() {{ 
     var db = require('internal'); 
     if(!db.User.exists('{0}')) 
      db.User.save({{ _key:'{0}', UserAppState:1 }}); 
     }} 
     // and other actions 
     return {{ 'Executed': true }}; 
    }}", myModel.userId)) 

괜찮 았는데,하지만 난 내 모델의 목록을 통과 할 때, 어떻게 문자열 (또는 ArangoDB 스크립트)로를 반복 할 수 있습니까? 예를 들어

:

string.Format(@" 
    function() {{ 
     var db = require('internal'); 
     for (i = 0; i < {0}.count; i++){{  // I know didn't work this block code! 
     if(!db.User.exists('{i.key}')) 
      db.User.save({{ _key: ""'i.key'"", UserAppState:1 }}); 
      // and other actions 
     }} 
     return {{ 'Executed': true }}; 
    }}", lstMyModels); 

이 하나가 나를 도울 수?!

답변

1

C# 문자열 보간 된 객체를 단일 쿼리로 결합하여 함께 작동하지 않는 ArangoDB 트랜잭션 기능과 결합하기 때문에이 예제가 주어진 경우에는 가능하지 않다고 생각합니다.

첫 번째 예제는 문자열에 전달하는 프리미티브 값을 사용하기 때문에 작동하지만 두 번째 예제에서는 개체 목록을 전달하고 목록 자체에 연결되지 않은주기를 사용하여 반복합니다. 이 줄

for (i = 0; i < {0}.count; i++) { 
lstMyModels는 C#을 목록 객체이며, 실제로이 같은 보간 문자열로 끝날 것이기 때문에

가 작동하지 않습니다

for (i = 0; i < System.Collections.Generic.List`1[System.Object].count; i++) { 

에 필요한 ArangoDB에 이해되지 않는다 트랜잭션을 실행하십시오. 또한 i 변수는 현재주기 반복 인덱스 역할을하는 간단한 숫자이므로 i.key을 호출하는 것은 잘못되었습니다.

복잡한 문자열 보간 대신 드라이버 인 transaction parameter passing을 사용해야합니다.

편집 :

의가이 같은 객체가 있다고 가정 해 봅시다 :

var transactionData = new List<TransactionEntity> 
{ 
    new TransactionEntity 
    { 
     Foo = "string1" 
    }, 
    new TransactionEntity 
    { 
     Foo = "string2" 
    }, 
    new TransactionEntity 
    { 
     Foo = "string3" 
    } 
}; 

var transactionResult = db.Transaction 
    .WriteCollection("myCollection") 
    .Param("data", transactionData) 
    .Execute<List<TransactionEntity>>(@" 
    function (params) { 
     var db = require('internal').db; 

     for (var i = 0; i < params.data.length; i++) { 
      db.myCollection.save(params.data[i]); 
     } 

     return db._query('FOR doc IN myCollection SORT TO_NUMBER(doc._key) RETURN doc').toArray(); 
    } 
    "); 
+0

덕분에 많은 위해를 :

다음
public class TransactionEntity { public string Foo { get; set; } } 

는이 같은 예를 들어 트랜잭션 매개 변수로 전달할 수 있습니다 대답. 내 보간 C# 목록 개체 및 문자열에 대한 귀하의 의견을 알았지 만 ... [트랜잭션 매개 변수 전달] (https://docs.arangodb.com/3.0/Manual/Transactions/Passing.html)도 불가능하다고 생각합니다. ArangoDB-NET ... 당신은 저의 도전 과제를 구현할 수 있습니까? 이 드라이버를 사용하여 목록을 반복하는 방법은 무엇입니까? –

+0

@KorekiXeri 트랜잭션 매개 변수로 전달할 개체의 구조를 알려 주실 수 있습니까? – yojimbo87

+0

간단한 사용 사례에서 내 개체는 다음과 같습니다. 트랜잭션으로 전달되는 연락처 (Edge Coll) [속성 : From, To, UserName 등]. 이 목록은 ArangoDB에 대한 트랜잭션으로 지속되어야합니다. –