2016-09-13 3 views
1

私は自分のモデルの1つのアイテムを扱うときにはArnagoDB_NETのTransactionと一緒に作業しました。モデルのリストを渡すときに問題があります。上記の例私のモデルのリストを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のトランザクション機能と組み合わせて、単一のクエリに組み合わせるだけでは機能しないので、これはあなたの例では考えられません。

最初の例は、文字列に渡すプリミティブな値を使用しているため動作しますが、2番目の例では、オブジェクトのリストを渡し、リスト自体に接続されていないサイクルを使用して繰り返します。このライン

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というsupported by the ArangoDB-NETドライバを使用するようにしてください。

EDIT:

は、あなたがこのようなオブジェクトがあるとしましょう:

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

その後、あなたはこのような例のトランザクションパラメータとして渡すことができますため

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

おかげで多くのことを回答。私はC#リストオブジェクトと文字列の補間についてのあなたのコメントを知っていましたが、[トランザクションパラメータの受け渡し](https://docs.arangodb.com/3.0/Manual/Transactions/Passing.html)でさえ不可能だと思います。 ArangoDB-NETで...あなたはそれで私の挑戦を実装できますか?このドライバを使用してリストを反復する方法は? –

+0

@KorekiXeriトランザクションパラメータとして渡すオブジェクトの構造を教えてください。 – yojimbo87

+0

の単純な使用例では、私のオブジェクトは次のとおりです。Contact(edge Coll)[プロパティ:From、To、UserNameなど]、トランザクションとしてリストとして渡されます。このリストはArangoDBへのトランザクションとして存続する必要があります。 –

関連する問題