3

也许这是一个简单的问题,但确实AsQueryable()有一些性能损失?

一般来说,我们正在使用 RavenDB,并且我们有这样的现有代码

protected override IQueryable<T> QueryableIndexRawQuery(string rawQuery, int skip = 0, int take = 128, string indexName = null) 
{ 
    var defaultIndexName = !string.IsNullOrWhiteSpace(indexName) ? indexName : string.Format("{0}{1}", typeof(T).Name, IndexPreffix);

    return this.Session.Advanced.DocumentStore.DatabaseCommands.GetIndex(defaultIndexName) != null 
        ? this.Session.Advanced.LuceneQuery<T>(defaultIndexName).Statistics(out this.Statistics).Skip(skip).Take(take).Where(rawQuery).AsQueryable()
        : this.Session.Advanced.LuceneQuery<T>().Statistics(out this.Statistics).Skip(skip).Take(take).Where(rawQuery).AsQueryable();
}

所以 Where 子句返回我们IDocumentQuery然后我们尝试表示它AsQueryable()

this.Session.Advanced.LuceneQuery<T>(defaultIndexName).Statistics(out this.Statistics).Skip(skip).Take(take).Where(rawQuery)

问题AsQueryable()最终在内部做什么?它是如何转换的?带有内存集合示例的答案List<>也将非常有用。

像这样:

    var list = new List<string>() { "1", "2", "3" };
    list.AsQueryable();
4

1 回答 1

1

.AsQueryable()强制我们在内存中评估查询,因为您使用的是session.Advanced.LuceneQuery(). 不建议这样做。session.Query()如果要使用 IQueryable,则需要使用。

于 2013-04-16T05:22:37.147 回答