将我的模型列表传递给 ArangoDB-NET 中的事务
pass a list of my model to Transaction in ArangoDB-NET
当我处理模型中的一项时,我只是在 ArnagoDB_NET 中使用事务。但是当我想传递我的模型列表时遇到问题。
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);
谁能帮帮我?!
根据您的示例,我认为这是不可能的,因为您将 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 which is supported by the ArangoDB-NET 驱动程序而不是复杂的字符串插值。
编辑:
假设您有这样的对象:
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();
}
");
当我处理模型中的一项时,我只是在 ArnagoDB_NET 中使用事务。但是当我想传递我的模型列表时遇到问题。
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);
谁能帮帮我?!
根据您的示例,我认为这是不可能的,因为您将 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 which is supported by the ArangoDB-NET 驱动程序而不是复杂的字符串插值。
编辑:
假设您有这样的对象:
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();
}
");