0

У меня большая проблема с OQL-запросом в OpenAccessDomainService.OpenAccessDomainService Выполнение OQL-запроса очень медленное

У меня есть приложение с клиентом Silverlight и веб-службой RIA (OpenAccessDomainService), и мне нужно реализовать ленивый подход к загрузке.

Например, я создал метод getAnimalsLazy (string stringQuery, int range, int page), где я могу передать stringQuery из фильтров, записей на страницу и страницу. Эти методы работают отлично, но значительно медленнее.

Для сравнения я создал метод getAnimals(), который так быстр, он загружает 15 000 записей за ~ 4 сек. Когда я запускаю getAnimalsLazy, он загружает 25 записей за ~ 2 сек.

Я не знаю, что я делаю неправильно, может кто-нибудь мне помочь.

Это пример кода:

[EnableClientAccess()] 
public partial class ZooDomainService : OpenAccessDomainService<Model.ZooDomainModel> 
{ 
    public ZooDomainService() : base() 
    { 
    } 


    /// <param name="stringQuery">eg. AND (r.type = "Elephant" OR r.type = "Monkey") ORDER BY r.id ASC</param> 
    public IQueryable<Animals> getAnimalsLazy(string stringQuery, int range, int page) 
    { 
     stringQuery = "SELECT r FROM AnimalsExtent AS r WHERE true " + stringQuery; 

     Database db = Database.Get("Connection"); 
     IObjectScope scope = db.GetObjectScope(); 
     Query<Animals> qry = scope.GetOqlQuery<Animals>(stringQuery); 

     int toSkip = (page - 1) * range; 
     qry.Skip = toSkip; 
     qry.MaxResultCount = range; 

     return qry.ExecuteEnumerable().AsQueryable<Animals>(); 
    } 

    public IQueryable<Animals> getAnimals() 
    { 
     return this.DataContext.Animals; 
    } 
} 

ответ

0

Я нашел решение моей проблемы, когда я реорганизовать getAnimalsLazy с this.DataContext.ExecuteQuery (QueryString) все работает отлично.

string stringQuery = "SELECT * FROM animals AS r WHERE true ORDER BY r.id ASC LIMIT 25 OFFSET 0"; 
return this.DataContext.ExecuteQuery<Animals>(stringQuery).AsQueryable(); 
Смежные вопросы