Azure移动服务 - 通过自定义参数传递数组

时间:2013-06-06 15:25:38

标签: c# .net azure azure-mobile-services

我正在将Azure Mobile Services与C#客户端一起使用。我有一张“得分”表,每个得分都有一个Facebook ID。我需要做的是为用户传递一系列朋友,并返回该朋友列表中的所有分数。

所以我在客户端尝试了这个:

        return _client.GetTable<Score>().WithParameters(new Dictionary<string, string>
        {
            { "Level", level.ToString() },
            //aggregate our string[] to a comma-delimited string
            { "Friends", friends.Aggregate(new StringBuilder(), (b, s) => b.Append(s).Append(',')).ToString() }

        }).ToListAsync();

这很奇怪我只能为自定义参数传递字符串。

所以我在服务器上读到了这个:

function read(query, user, request) {

    query.where({ Level: request.parameters.Level, UserId: request.parameters.Friends.split(',') });

    request.execute();
}

看起来似乎没有以逗号分隔的列表。我在服务器上收到此错误:

Error in script '/table/Score.read.js'. Error: Unsupported literal value chucknorris,bobloblaw,

注意:我通过chucknorrisbobloblaw作为Facebook ID进行测试。

还有其他方法让这项工作成功吗?如果我取出字符串分隔的东西,“Level”值过滤就好了。

2 个答案:

答案 0 :(得分:1)

使用此服务器端脚本:

function read(query, user, request) {

    var innerSql = '';
    var friends = request.parameters.Friends.split(',');
    var parameters = new Array(friends.length + 1);
    parameters[0] = request.parameters.Level;

    for (var i = 0; i < friends.length; i++) {
        if (i !== 0) {
            innerSql += ' or ';
        }
        innerSql += 'UserId = ?';

        parameters[i + 1] = friends[i];
    }

    mssql.query('select * from Score where Level=? and (' + innerSql + ')', parameters, {
        success: function (results) {
            request.respond(statusCodes.OK, results);
        }
    });

}

如果有人有更清洁的解决方案,我会保持这个答案开放几天。

答案 1 :(得分:1)

您对mssql对象的使用肯定有效,但您也可以在query.where调用中使用函数,函数返回您想要的条件:

function read(query, user, request) {
    query.where(function(level, userIds) {
        return this.Level === level && this.UserId in userIds; 
    }, request.parameters.Level, request.parameters.Friends.split(','));

    request.execute();
}

请注意,此函数中的in运算符的行为与JavaScript中的in运算符完全不同。相反,它完全用于具有“或”组的相等语句,您正在“手动”创建它以传递给SQL对象。