2008-11-05 57 views
6

我有一個LINQ查詢,我試圖把在一個序列化對象的分佈式緩存(速度),但其未能由於LINQ到SQL懶列表我將如何序列化LINQ到SQL懶惰名單

像這樣

return from b in _datacontext.MemberBlogs 
        let cats = GetBlogCategories(b.MemberBlogID) 
        select new MemberBlogs 
        { 
         MemberBlogID = b.MemberBlogID, 
         MemberID = b.MemberID, 
         BlogTitle = b.BlogTitle, 
         BlogURL = b.BlogURL, 
         BlogUsername = b.BlogUsername, 
         BlogPassword = b.BlogPassword, 
         Categories = new LazyList<MemberBlogCategories>(cats) 
        }; 

LazyList是同一類羅布科納使用他的MVC店面...

所有三個類被標記序列化(MemberBlogs,MemberBlogCategories,LazyList任何...想法?

回答

6

如果你把它在一個分佈式緩存,你需要完全避免了LazyList。然後,您可以調用.ToList()圍繞整個LINQ語句中:

(from x select new MemberBlogs).ToList() 

這應該然後是可緩存的,因爲它會強制評估的查詢。

2

如果你爲什麼要使用一個懶惰的名單緩存呢?不要使用懶惰列表,使用緩存,問題就會消失。

3

我只是猜測,但我要說的問題是,它是序列化的查詢,而不是結果;我不知道是什麼LazyList實施的樣子,但你也許可以增加實際執行之前,其序列查詢的OnSerializing方法;喜歡的東西:

[OnSerializing] 
private void ExecuteLinqQuery(StreamingContext context) 
{ 
    if (!SomethingThatIndicatesThisLinqQueryHasNotBeenExecuted) 
     LinqVariable.ToList() 
} 

這樣你能留住延遲加載(對於任何不進入緩存),但隨後又如果它擊中緩存,它會執行LINQ查詢和緩存結果。

0

我知道這是一箇舊帖子,但我有同樣的問題,因爲我想執行我的LazyList並將它們放到AppFabric緩存中。我最終將一些自定義序列化邏輯放入LazyList類型中。

第一部分現在看起來是這樣的:

public class LazyList<T> : IList<T>, ISerializable 
{ 

    public LazyList() 
    { 
     this.query = new List<T>().AsQueryable(); 
    } 

    public LazyList(SerializationInfo info, StreamingContext context) 
    { 
     try { 
      this.inner = (List<T>)info.GetValue("InnerList", typeof(List<T>)); 
     } 
     catch (Exception ex) 
     { 
      this.inner = null; 
     } 
    } 

    public void GetObjectData(SerializationInfo info, StreamingContext context) 
    { 
     if (this.inner != null) 
      info.AddValue("InnerList", this.inner.ToList()); 
    } 

    public LazyList(IQueryable<T> query) 
    { 
     this.query = query; 
    } 

    public LazyList(List<T> l) 
    { 
     inner = l; 
    } 
}