2008-11-05 9 views
6

मेरे पास एक linq क्वेरी है और मैं इसे वितरित कैशिंग (वेग) के लिए एक धारावाहिक वस्तु में डालने की कोशिश कर रहा हूं लेकिन LINQ-to-SQL के कारण यह विफल रहा है आलसी सूचीमैं LINQ-to-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 है एक ही कक्षा रोब Conery उसकी MVC स्टोर के सामने में उपयोग करता है ...

सभी तीन वर्गों

serializable चिह्नित कर रहे हैं (MemberBlogs, MemberBlogCategories, LazyList ... किसी भी तरह विचार?

उत्तर

6

यदि आप इसे एक वितरित कैश में डाल रहे हैं तो आपको LazyList से पूरी तरह से बचने की आवश्यकता होगी। फिर आप के रूप .ToList() पूरे LINQ बयान के आसपास कॉल कर सकते हैं:

(from x select new MemberBlogs).ToList() 

यह तो cachable होना चाहिए क्योंकि यह प्रश्नों का मूल्यांकन किया जाना बाध्य करती है।

2

यदि आप इसे कैशिंग कर रहे हैं तो आप आलसी सूची का उपयोग क्यों कर रहे हैं? आलसी सूची का उपयोग न करें, कैशिंग का उपयोग करें, और समस्या दूर हो जाती है।

3

मैं बस अनुमान लगा रहा हूं, लेकिन मैं कहूंगा कि समस्या यह है कि यह परिणामों की बजाय क्वेरी को क्रमबद्ध कर रहा है; मुझे नहीं पता कि LazyList के कार्यान्वयन की तरह क्या दिखता है, लेकिन आप शायद एक ऑनसिरियलाइजिंग विधि जोड़ सकते हैं जो वास्तव में इसे क्रमबद्ध करने से पहले क्वेरी निष्पादित करता है; कुछ की तरह:

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

इस तरह आप (कुछ भी है कि अपने कैश में जाने के लिए नहीं है) लेज़ी लोड रखने के लिए मिलता है, लेकिन फिर भी अगर यह कैश हिट करता है, यह LINQ क्वेरी को निष्पादित करेंगे और परिणाम कैश करें।

0

मुझे पता है कि यह एक पुरानी पोस्ट है, लेकिन मुझे वही समस्या थी क्योंकि मैं अपने LazyList को निष्पादित करना चाहता था और उन्हें ऐपफैब्रिक कैश में रखना चाहता था। मैं LazyList प्रकार में कुछ कस्टम serialization तर्क डाल दिया।

पहले भाग अब इस तरह दिखता है:

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; 
    } 
} 
संबंधित मुद्दे