2013-04-15 9 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(); 
} 

과 같은 코드를 기존 한 것은 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-out-of-process-queries-iqueryable.aspx). –

답변

1

.AsQueryable() 힘 우리를 당신이 session.Advanced.LuceneQuery()을 사용하고 있기 때문에, 메모리에서 쿼리를 평가하기. 권장하지 않습니다. IQueryable을 사용하려면 session.Query()을 사용해야합니다.

+0

좋아, 우리는 꽤 completecated입니다 서버 쪽 필터링이 필요하기 때문에 우리는 LuceneQuery 있습니다. 예를 들어, 우리는 session.Query()와 같은 필터링을 어떻게 할 수 있습니까? var query = _session.Advanced.LuceneQuery () .Where ("(Name :(* ontra *)) AND (LabelKey : (* ontra *)) OR (DescriptionKey : (* ontra *) AND (LabelKey : (* tra *))) "). ToList(); Search() 메소드를 사용할 수는 있지만 복합 조건에는 적합하지 않습니다. 어쩌면 그것은 또 다른 질문이지만 초기 질문은 그것에 의해 제기되었습니다. –