2014-08-28 3 views
1

Я пытаюсь выполнить запрос с параметрами против локального кеша или сервера (если в кеше ничего не найдено).BreezeSharp - запрос с параметрами локального кеша

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.

Это известная проблема? Есть ли какое-нибудь обходное решение?

ответ

0

Не уверен, что я понимаю, ни breeze.js, ни breeze.sharp не могут автоматически выполнять «локальный запрос кеша», который включает в себя параметры. Это объясняется тем, что интерпретация параметров только реально определена на сервере, а не на клиенте.

Похоже, что то, что вы сделали, это определение пользовательской реализации вашего запроса «с параметрами» в breeze.js, который полностью обходит внутреннюю реализацию Breeze. Это верно?

+0

Я не выполнил какую-либо пользовательскую реализацию. Я снова проверил код JavaScript, и я ошибся: ** он не работает как ожидалось **. В основном запрос к локальному кэшу игнорирует параметры и возвращает каждый объект, найденный в кеше для данного ресурсаName (entityType). Я собираюсь принять вас в качестве ответа: ** запрос с параметрами в отношении локального кеша не поддерживается в BreezeJS или BreezeSharp ** – markolazic88

Смежные вопросы