【问题标题】:Azure Mobile Services - Passing arrays through Custom ParametersAzure 移动服务 - 通过自定义参数传递数组
【发布时间】:2013-06-06 15:25:38
【问题描述】:

我正在使用带有 C# 客户端的 Azure 移动服务。我有一个“分数”表,每个分数都有一个 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 进行测试。

还有其他方法可以使这项工作吗?如果我取出字符串分隔的东西,“级别”值过滤就很好了。

【问题讨论】:

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


    【解决方案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 对象。

    【讨论】:

    • 我会在星期一试试这个,这似乎比原始 SQL 更好。
    【解决方案2】:

    让它与这个服务器端脚本一起工作:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-21
      • 1970-01-01
      • 2018-09-23
      相关资源
      最近更新 更多