0

Windows Azure Mobile Services Preview テーブル ("Item" という名前) の "読み取り" 操作を次のように変更しました。

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
     }

Javascript コードを処理するために c# コードを変更するにはどうすればよいですか? 私は優れたプログラマーではなく、いつでもアドバイスを利用できるので、全体的なアプローチを自由に批判してください!

ありがとう

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 を実現するために使用できます (サーバー側ではスクリプトは必要ありません)。もう 1 つはスクリプトが必要ですが、これについては後で説明します。

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 に答える