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

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();

这很复杂,但是Jon Skeet在这个页面上进行了一些解释。 - Matthew Watson
1个回答

1

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


好的,我们使用LuceneQuery是因为我们需要进行服务端过滤,这是非常复杂的。例如,如何使用session.Query()进行这样的过滤 - var query = _session.Advanced.LuceneQuery<Entity>().Where("(Name:(ontra)) AND (LabelKey:(ontra)) OR (DescriptionKey:(ontra) AND (LabelKey: (tra)))").ToList(); 我们可以使用Search()方法,但它不适用于复合条件。也许这是另一个问题,但最初的问题是由此引起的。 - Jevgenij Nekrasov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接