AsQueryable()是如何在内部工作的

本文关键字:在内部 工作 AsQueryable | 更新日期: 2023-09-27 18:09:29

也许这是一个简单的问题,但是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();

AsQueryable()是如何在内部工作的

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