能否有人帮我加速这个查询?我正在使用RavenDB 3.5.8,以下查询需要相当长的时间(在首次加载时尤其如此):
var query = session
.Query<Card>()
.Include(p => p.AuthorId)
.Include(p => p.CompanyId)
.Where(x => !x.Id.StartsWith("Archived"))
.Where(x => !x.IsDeleted);
do
{
var popStash = stashedResults != null && stashedResults.Count > 0;
if (popStash)
{
stashSkip = stashedResults.Count;
}
results = query
.Statistics(out stats)
.OrderByDescending(x => x.ModifiedAt)
.Skip(this.ServerPage * this.ServerPageSize)
.Take(this.ServerPageSize)
.Select(MapCard)
.Where(x => x.IsAuthorized)
.Skip(clientPage * command.PageSize)
.Take(command.PageSize - stashSkip)
.ToList();
if (popStash)
{
results = results.Union(stashedResults).ToList();
stashedResults.Clear();
}
if (results.Count < command.PageSize)
{
++this.ServerPage;
clientPage = 0;
if (results.Count > 0)
{
stashedResults = results;
}
}
} while (results.Count < command.PageSize &&
stats.TotalResults >= (this.ServerPage * this.ServerPageSize) + this.ServerPageSize);
我知道这还远非完美,但需要注意的是,由于RavenDB默认不支持认证,所以双重Skip
和Take
是必要的。因此,我必须使用以下代码段对每个卡片进行Map
并添加IsAuthorized
字段:
IsAuthorized = session.Advanced.IsOperationAllowedOnDocument("Authorization/Users/" + user.Id, "Cards/View", card.Id).IsAllowed;
基本上发生的情况是,首先查询会加载一堆卡片(实际上 ServerPageSize 定义了那么多张卡片)而不考虑安全性,稍后当应用安全控制时,command.PageSize
张卡片就会被加载。(这个网页会动态地加载卡片——首先加载50张卡片,当浏览完后再抓取另外50张,以此类推……)。
请问有人能给我一些提示,如何提高我的代码性能?