0

J'ai un gros problème avec la requête OQL dans OpenAccessDomainService.OpenAccessDomainService L'exécution de la requête OQL est très lente

J'ai une application avec le client Silverlight et le service Web RIA (OpenAccessDomainService), et j'ai besoin d'implémenter une approche de chargement paresseux.

Par exemple, j'ai créé la méthode getAnimalsLazy (string stringQuery, int range, int page) où je peux transmettre stringQuery à partir de filtres, d'enregistrements par page et page. Cette méthode fonctionne bien, mais elle est considérablement lente.

Pour le comparer j'ai créé la méthode getAnimals() qui est si rapide, elle charge 15 000 enregistrements en ~ 4 sec. Quand je lance getAnimalsLazy, il charge 25 enregistrements en ~ 2 sec.

Je ne sais pas ce que je fais mal, quelqu'un pourrait m'aider.

Ce code est par exemple:

[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; 
    } 
} 

Répondre

0

Je trouve la solution de mon problème quand je Refactor getAnimalsLazy avec this.DataContext.ExecuteQuery (queryString) tout fonctionne bien.

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();