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 クエリを使用して結果を設定しても Dynamic 型が更新されないためだと思います。

結果のタイプを設定する以外に、これを回避する方法はありますか?

ありがとう

ブレント

4

2 に答える 2

1

Database.Queryメソッド呼び出しの結果はIEnumerable<IGrouping>object, object>>(group by 操作のため) シーケンスであり、その各要素にはKeyプロパティがあります。WebCache は、objectSession などと同様に型のコレクションであり、これらには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 に答える
1

WebMatrix.Data は、.netの動的機能の上に構築されています。最初のサンプルでは、Db.Query​​メソッドは動的オブジェクトのコレクションを返すため、ループ内でc.Key動的に解決されて機能します。

しかし、結果を に入れると、 はとしてWebCache処理されます。だからあなたが書くときresultsobject

var results = WebCache.Get(cacheItemKey);

の静的型はresultsなりますobjectが、ランタイム型は元のコレクションのままです。そのため、foreach引き続き機能しますがc.Key、動的なディスパッチが含まれていないため、呼び出しは失敗します。

動的ディスパッチを有効/強制するには、foearch で宣言resultsまたはdynamic使用dynamicします。

@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 に答える