AsQueryable()如何在内部工作?

时间:2013-04-15 12:02:44

标签: c# linq ravendb asqueryable

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

1 个答案:

答案 0 :(得分:1)

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