1

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

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

“对象”不包含“键”的定义

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

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

谢谢

布伦特

4

2 回答 2

1

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

但是,当您将结果放入时,WebCacheresults会将object. 所以当你写

var results = WebCache.Get(cacheItemKey);

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

要启用/强制动态调度声明resultsdynamicdynamic在您的 foarch 中使用:

@foreach (dynamic c in results ){ 
    var htmlKey = Server.UrlEncode(c.Key);
  <p><a href="@htmlKey" data-role="button">@c.Key</a></p>
}
于 2012-07-05T05:22:34.240 回答
1

您的Database.Query方法调用的结果是一个IEnumerable<IGrouping>object, object>>序列(因为 group by 操作),其中的每个元素都有一个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);
}
于 2012-07-05T06:30:41.020 回答