0

我修改了我的 Windows Azure 移动服务预览表(名为“项目”)上的“读取”操作,如下所示:

Javascript:

function read(query, user, request) 
{

var howRead;

if(howRead == "unique")
{
    var sqlUnique = "SELECT DISTINCT ? FROM Item WHERE qProjectCode = ?";
    mssql.query(sqlUnique)
    request.execute();
}
else if (howRead == "column")
{
    var sqlColumn = "SELECT ? FROM Item WHERE qProjectCode = ?";
    mssql.query(sqlColumn)
    request.execute();
}
else if (howRead == "all")
{
   var sqlAll = "SELECT * FROM Item WHERE qProjectCode = ?";
    mssql.query(sqlAll)
    request.execute();
}

}

当我想要返回单列值的唯一列表、单列中的所有项目或所有列的唯一列表时,这很简单,同时将读取限制为具有给定项目代码的那些记录。

现在,这在 C# 中有效,但会扫描整个表(以及其他项目代码)并始终返回所有列。这本质上是低效的。

C#

var client = new MobileServiceClient("[https path", "[key]");

var table = client.GetTable<Item>();

var query1 = table.Where(w => w.QProjectCode == qgv.projCode && w.QRecord == (int)lbRecord.Items[uStartRecordIndex]);

var query1Enum = await query1.ToEnumerableAsync();

foreach (var i in query1Enum)
     {
     // process data
     }

如何更改 c# 代码以处理 Javascript 代码?随意批评整体方法,因为我不是一个伟大的程序员,总是可以使用建议!

谢谢

4

1 回答 1

4

一些东西:

  • 在您的服务器代码中,mssql调用没有做任何事情(有用)。如果你想得到他们的结果,你需要向它传递一个回调(调用是异步的)。
  • 您的大多数场景都可以在客户端完成。唯一需要服务器代码的是带有DISTINCT修饰符的代码。
  • 对于这种情况,您需要将自定义参数传递给服务器脚本。您可以使用对象中的WithParameters方法MobileServiceTableQuery<T>来定义要传递给服务的参数。

假设这个数据类:

public class Item
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public string Other { get; set; }
    public string ProjectCode { get; set; }
}

下面的代码仅可用于在客户端完成场景 2 和 3(服务器端不需要脚本)。另一个需要一些脚本,我稍后会介绍。

Task<IEnumerable<string>> ReadingByColumn(IMobileServiceTable<Item> table, string projectCode)
{
    return table
        .Where(i => i.ProjectCode == projectCode)
        .Select(i => i.Name)
        .ToEnumerableAsync();
}

Task<IEnumerable<Item>> ReadingAll(IMobileServiceTable<Item> table, string projectCode)
{
    return table.Where(i => i.ProjectCode == projectCode).ToEnumerableAsync();
}

Task<IEnumerable<string>> ReadingByColumnUnique(IMobileServiceTable<Item> table, string projectCode)
{
    var dict = new Dictionary<string, string>
    {
        { "howRead", "unique" },
        { "projectCode", projectCode },
        { "column", "Name" },
    };
    return table
        .Select(i => i.Name)
        .WithParameters(dict)
        .ToEnumerableAsync();
}

现在,为了支持最后一种方法(它接受参数,我们需要在服务器脚本上执行此操作:

function read(query, user, request) 
{
    var howRead = request.parameters.howRead;
    if (howRead) {
        if (howRead === 'unique') {
            var column = request.parameters.column; // WARNING: CHECK FOR SQL INJECTION HERE!!! DO NOT USE THIS IN PRODUCTION!!!
            var sqlUnique = 'SELECT DISTINCT ' + column + ' FROM Item WHERE ProjectCode = ?';
            mssql.query(sqlUnique, [request.parameters.projectCode], {
                success: function(distinctColumns) {
                    var results = distinctColumns.map(function(item) {
                        var result = [];
                        result[column] = item; // mapping to the object shape
                        return result;
                    });

                    request.respond(statusCodes.OK, results);
                }
            });
        } else {
            request.respond(statusCodes.BAD_REQUEST, {error: 'Script does not support option ' + howRead});
        }
    } else {
        // no server-side action needed
        request.execute();
    }
}
于 2013-01-18T22:06:03.807 回答