我在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类型。
除了设置结果的类型之外还有其他方法吗?
由于
布伦特
答案 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);
}