2011-05-24 66 views
2

所以我有以下情況,我不知道如何處理它。IQueryable表達式與文字

在我們構建的應用程序中,我們有一個ReferenceDataService,用於通過RIA服務加載數據。查詢在客戶端以IQuerable的形式構建並提交給服務器進行檢索。現在大多數提交的參考查詢都是相同的並且被多次調用,因此我想要從實體緩存中爲這些查詢提供服務。

下面是生成的查詢表達式的一個示例,我突出顯示了查詢更改的區域。有些情況下,查詢有附加標準,但大多數人可能不需要。

Chime.DataModel.classification[] 
       .Where(c => ((value(Chime.Modules.Reference.Client.Agent.ReferenceDataLoader+<>c__DisplayClass20).includeSchema 
         *AndAlso c.class_code.StartsWith(value(Chime.Modules.Reference.Client.Agent.ReferenceDataLoader+<>c__DisplayClass20).schema))* 
         OrElse (Not(value(Chime.Modules.Reference.Client.Agent.ReferenceDataLoader+<>c__DisplayClass20).includeSchema) 
         AndAlso *c.parent_code.StartsWith(value(Chime.Modules.Reference.Client.Agent.ReferenceDataLoader<>c__DisplayClass20).schema))))* 
       .OrderByDescending(c => c.value_scheme_ind) 
       .ThenBy(c => c.sequence_number) 
       .ThenBy(c => c.class_label) 

所以我想要做的是實際上緩存查詢,如果另一個進來以相同的標準我可以擊中緩存。我遇到的問題是查詢中使用的字面值似乎不可用,因此我無法確定一個查詢是否與另一個查詢不同。例如架構代碼無處可尋。它必須在某個時刻發送到服務器,但我不確定如何才能完成。

有沒有人知道一種方法來做到這一點或遇到此前?

戴夫

+0

上面的摘錄是從調用ToString()? – Jeff 2011-05-24 01:19:15

回答

2

如果您正在使用WCF數據服務,我只想說,在你的IQueryable調用toString(),它會返回來對數據服務執行查詢的確切URI ...你可以簡單地基於該字符串值進行緩存。

據我所知,RIA沒有公開這樣的鉤子,所以你必須依賴更傳統的方法。

實現一個ExpressionVisitor,訪問您的IQueryable.Expression並計算它的哈希碼。

你提到你不能在表達式樹中看到你的常量字符串值。這是因爲它們尚未內聯到表達式樹中,因此仍以MemberAccessExpressions而非ConstantExpressions的形式存在。要解決此問題,您可以使用部分評估ExpressionVisitor。對於這樣的源在這裏給出

http://msdn.microsoft.com/en-us/library/bb546158.aspx

看那計算器類。