Razor Dynamic Query&的WebCache

时间:2012-07-05 00:37:46

标签: c# caching dynamic razor webmatrix

我在Razor视图中创建了以下代码。

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

缓存代码运行良好,但在进行结果交互时,在尝试访问项目的动态属性时出现错误。

'object'不包含'Key'

的定义

我认为这是因为当我使用LINQ查询将结果设置为空时,初始返回结果类型为Null并且不更新Dynamic类型。

除了设置结果的类型之外还有其他方法吗?

由于

布伦特

2 个答案:

答案 0 :(得分:1)

WebMatrix.Data建立在.net的dynamic features之上。在第一个示例中,Db.Query方法返回动态对象的集合,这就是为什么在循环中c.Key将动态解析并起作用。

但是当您将结果放入WebCache时,它会将results作为object处理。所以当你写

var results = WebCache.Get(cacheItemKey);

results的静态类型将为object,但运行时类型仍然是原始集合,这就是foreach仍然有效的原因,但c.Key调用将失败因为没有涉及动态调度。

要启用/强制动态调度,请将results声明为dynamic或在您的fomearch中使用dynamic

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

答案 1 :(得分:1)

Database.Query方法调用的结果是IEnumerable<IGrouping>object, object>>序列(因为按操作分组),其中每个元素都有Key属性。 WebCache是​​object类型的集合,就像Session等一样,并且它们没有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);
}