1

ローカル キャッシュまたはサーバーに対してパラメーターを使用してクエリを実行しようとしています (キャッシュに何も見つからない場合)。

public async Task<List<T>> Get(IDictionary<string, object> parameters, string resourceName = "", FetchSource fetchSource = FetchSource.None)
{
    try
    {
        var query = resourceName == string.Empty ? EntityQuery.From<T>().WithParameters(parameters) : EntityQuery.From<T>(resourceName).WithParameters(parameters);
        var queryResult = await this.ExecuteQuery(query, fetchSource);
        var result = queryResult.ToList();
        return result;

    }
    catch (Exception e)
    {
        return new List<T>(); // return empty result instead
    }
}

FetchSource は列挙型です。

public enum FetchSource
{
    None = 0,

    FromServer = 1,

    FromCache = 2,

    FromCacheOrServer = 3
}

そして、ここに ExecuteQuery メソッドがあります:

protected async Task<IEnumerable<T>> ExecuteQuery(EntityQuery<T> query, FetchSource fetchSource = FetchSource.None)
        {
            //...
            if (fetchSource == FetchSource.FromCacheOrServer)
            {
                var result = query.ExecuteLocally(this.EntityManager);  // Throws error
                if (result != null && result.Any())         
                {
                    return result;
                }

                return await query.Execute(this.EntityManager);
            }
            //...
        }

クエリをローカルで実行しようとすると、次の例外がスローされます。

{"タイプ 'WhereEnumerableIterator`1[StanleySteemer.Nimbus.Client.Common.Model.Proxy.RouteOrder]' のオブジェクトをタイプ 'DataServiceOrderedQuery[StanleySteemer.Nimbus.Client.Common.Model.Proxy.RouteOrder]' にキャストできません。" }

特にこの件に関してドキュメントには何も見つかりませんでしたが、BreezeJS に同様の機能を実装しましたが、問題なく動作していました (更新: 正しく動作しません)。

    findWithParametersInCacheOrServer = function (parameters, recordsLimit) {
        var query = breeze.EntityQuery
            .from(resourceName)
            .withParameters(parameters);

        var r = executeCacheQuery(query);
        if (r) {
            if (r.length > recordsLimit) {
                return Q.resolve(r);
            }
        }

        return executeQuery(query);
    };

    function executeCacheQuery(query) {
        return entityManagerProvider.manager().executeQueryLocally(query);
    }

JavaScript のデータ アーキテクチャは、TempHire の例に似ています。

これは既知の問題ですか? 回避策はありますか?

4

1 に答える 1

0

よくわかりませんが、breeze.js も Breeze.sharp も、パラメータを含む「ローカル キャッシュ クエリ」を自動的に実行できません。これは、パラメーターの解釈が実際にはサーバー上でのみ定義され、クライアント上では定義されないためです。

Breeze の内部実装を完全にバイパスする、breeze.js で特定の「with parameters」クエリのカスタム実装を定義しているように思えます。これは正しいです?

于 2014-08-30T06:29:07.177 に答える