我在OpenAccessDomainService中遇到OQL查询的大问题。
我有Silverlight客户端和RIA Web服务(OpenAccessDomainService)的应用程序,我需要实现延迟加载方法。
例如,我创建了方法getAnimalsLazy(string stringQuery,int range,int page),我可以从过滤器,每页和每页的记录传递stringQuery。这种方法工作正常,但速度非常慢。
为了比较它,我创建了方法getAnimals()这么快,它在~4秒内加载了15000条记录。当我运行getAnimalsLazy时,它会在~2秒内加载25条记录。
我不知道我做错了什么,有人可以帮助我。
这是示例代码:
[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 :(得分:0)
当我使用this.DataContext.ExecuteQuery(queryString)重构getAnimalsLazy时,我找到了问题的解决方案。一切正常。
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();