BreezeSharp - 使用针对本地缓存的参数进行查询

时间:2014-08-28 15:19:54

标签: breeze breeze-sharp

我正在尝试使用针对本地缓存或服务器的参数执行查询(如果在缓存中找不到任何内容)。

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中实现了类似的功能,它没有问题( UPDATE :它无法正常工作):

    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示例。

这是一个已知问题吗?它有什么解决方法吗?

1 个答案:

答案 0 :(得分:0)

不确定我理解,breeze.js和breeze.sharp都不能自动执行本地缓存查询&#39;涉及参数。这是因为参数的解释只在服务器上实际定义,而不是在客户端上定义。

听起来你所做的就是定义具体参数的自定义实现&#39;在breeze.js中查询完全绕过Breeze的内部实现。它是否正确?