2013-04-15 75 views
3

也許這是一個簡單的問題,但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(); 
+0

這很複雜,但是[由Jon Skeet在本頁中解釋](http://msmvps.com/blogs/jon_skeet/archive/2011/02/20/reimplementing-linq-to-objects-part- 43外的過程查詢與 - iqueryable.aspx)。 –

回答

1

.AsQueryable()迫使我們評估在內存中的查詢,因爲你正在使用session.Advanced.LuceneQuery()。這不被推薦。 如果您想使用IQueryable,則需要使用session.Query()

+0

好的,我們是LuceneQuery,因爲我們需要服務器端過濾,這是相當完整的。例如,我們如何使用session.Query() - var query = _session.Advanced.LuceneQuery ().Where(「(Name:(* ontra *))AND(LabelKey:(* ontra *)) OR(DescriptionKey:(* ontra *)AND(LabelKey:(* tra *)))「)。ToList();我們可以使用Search()方法,但它不適用於複合條件。也許這是另一個問題,但最初的一個問題是由它提出的。 –