2012-07-05 28 views
1

我在Razor視圖中創建了以下代碼。Razor Dynamic Query&WebCache

var Db= Database.Open("db"); 
var results = from t in Db.Query("up_rpt_hourlysales_today") 
    group t by t["Channel"]; 

我使用的數據與用下面的代碼...

@foreach (var c in results){ 
    var htmlKey = Server.UrlEncode(c.Key); 
    <p><a href="@htmlKey" data-role="button">@c.Key</a></p> 
} 

我想用這樣的WebCache我添加以下代碼。

var cacheItemKey = "Sales"; 
var cacheHit = true; 
var results = WebCache.Get(cacheItemKey); 

if (results == null) { 
    cacheHit = false; 
} 

if (cacheHit == false) { 
    var Db= Database.Open("db"); 
    results = from t in Db.Query("up_rpt_hourlysales_today") 
        group t by t["Channel"]; 

    WebCache.Set(cacheItemKey,results, 5,false); 
} 

緩存代碼工作得很好,但在結果的時候作用中我試圖訪問項目的動態屬性時,得到一個錯誤。

「對象」不包含「鍵」

的定義,我認爲,這是因爲inital返回結果類型爲空,而不是更新的動態類型,當我使用的結果設置爲它LINQ查詢。

除了設置類型結果有沒有辦法圍繞這個?

感謝

布倫特

+0

** ** BTW:你」重新從視圖直接訪問數據庫?這是最好的建築嗎?難道你不能在控制器上執行它,只是將你的items集合傳遞給視圖? –

+0

如果我有比僅這一個頁面更多的情況是真實的......複雜的複雜性的緣故 – Brent

回答

1

Database.Query方法調用的結果是一個IEnumerable<IGrouping>object, object>>序列(因爲該組由操作),其中的每個元素都具有Key屬性。該是的WebCache類型object的集合,就像會話等,所以你需要投的項目回原來的類型,這些沒有Key屬性:

var cacheItemKey = "Sales"; 
var cacheHit = true; 
var results = (IEnumerable<IGrouping<object, object>>)WebCache.Get(cacheItemKey); 

if (results == null) { 
    cacheHit = false; 
} 

if (cacheHit == false) { 
    var Db= Database.Open("db"); 
    results = Db.Query("up_rpt_hourlysales_today").GroupBy(t => t.Channel); 
    WebCache.Set(cacheItemKey,results, 5,false); 
} 
+1

This works great .. - 但是我需要使用下面的演員才能讓它正常工作。 (IEnumerable >) – Brent

1

WebMatrix.Data是建立在.NET的dynamic features頂部。在你的第一個例子中,Db.Query方法返回一組動態對象,這就是爲什麼在你的循環中c.Key將動態解析和工作。

但是,當您將結果放入WebCache時,它會將results作爲object來處理。所以,當你寫

var results = WebCache.Get(cacheItemKey);

靜態類型的resultsobject但運行時類型將仍然是原來的集合,這就是爲什麼foreach仍然有效,但c.Key通話將失敗,因爲沒有動態調度參與其中。

要啓用/強制動態調度申報results作爲dynamic或在foearch使用dynamic

@foreach (dynamic c in results){ 
    var htmlKey = Server.UrlEncode(c.Key); 
    <p><a href="@htmlKey" data-role="button">@c.Key</a></p> 
} 
+0

我喜歡在for循環使用動態的這個想法,但是當我測試了它,它並沒有正常工作。 WebCache.Get()的輸出的最佳解釋最終我投射了WebCache.Get結果。謝謝。 – Brent