2012-07-05 4 views
1

면도기 뷰에서 다음 코드를 생성했습니다.면도기 동적 쿼리 및 웹 캐시

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가 null로, 내가 사용하여 그 결과를 설정할 때 동적 유형이 업데이트되지 않습니다 때문이라고 생각 '키'

에 대한 정의가 포함되어 있지 않습니다 LINQ 쿼리

유형을 설정하는 것 이외의 다른 결과는입니다.

감사

브렌트

+0

** BTW ** : 당신 ' 보기에서 직접 DB에 액세스합니까? 최고의 아키텍처입니까? 컨트롤러에서이를 수행하고 항목 컬렉션을보기로 전달할 수 없었습니까? –

+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

이 훌륭한 작동합니다 .. -하지만이 제대로 작동하려면 다음 캐스트를 사용해야했습니다. (IEnumerable >) – Brent

1

WebMatrix.Data는 .NET의 dynamic features의 상단에 내장되어 있습니다. 먼저 Db.Query 메서드를 샘플링하면 동적 객체 컬렉션이 반환되므로 루프에서 c.Key이 동적으로 해결되고 작동합니다.

그러나 결과를 WebCache에 넣으면 resultsobject으로 처리합니다. 그래서 당신은

var results = WebCache.Get(cacheItemKey);

을 쓸 때 results의 정적 유형은 object되지만 실행시의 형태는 여전히 foreach가 여전히 작동 왜 원래의 콜렉션이 될 것입니다,하지만 동적 파견이 없기 때문에 c.Key 호출이 실패합니다 뒤얽힌.

활성화 /의 dynamic로 선언 results를 동적 디스패치 강제하거나 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

ForLoop에서 동적을 사용한다는 아이디어가 마음에 들었습니다.하지만 테스트했을 때 제대로 작동하지 않았습니다. WebCache.Get()의 출력에 대한 훌륭한 설명 결국에는 WebCache.Get 결과를 캐스팅했습니다.고맙습니다. – Brent