2012-04-13 14 views
5

मैं निम्नलिखित प्रपत्र की एक LINQ संस्थाओं के लिए प्रश्न हैं:नेस्टेड क्वेरी समर्थित नहीं है। Operation1 = 'UnionAll' Operation2 = 'MultiStreamNest'

var x = from a in SomeData 
    where ... some conditions ... 
    select new MyType 
    { 
     Property = a.Property, 
     ChildCollection = from b in a.Children 
         select new MyChildType 
         { 
          SomeProperty = b.Property, 
          AnotherProperty = b.AnotherProperty 
         } 
    }; 

var y = from a in SomeData 
    where ... some other conditions ... 
    select new MyType 
    { 
     Property = a.Property, 
     ChildCollection = from b in a.Children 
         select new MyChildType 
         { 
          SomeProperty = b.Property, 
          AnotherProperty = b.AnotherProperty 
         } 
    }; 

var results = x.Concat(y); 

(इस सरल उदाहरण है - 'जहां' और 'चुनें' खंड अधिक जटिल हैं । से यहाँ दिखाया गया है मैं एक संयुक्त एक अभी भी जटिल है, बहुत से सशर्त है बनाने के रूप में अलग-अलग क्वेरी बयानों का उपयोग कर रहा हूँ और संकलित करने के लिए)

ठीक संकलित एक उम्र लेता है, लेकिन अपवाद के साथ निष्पादन में विफल रहता है:

"The nested query is not supported. Operation1='UnionAll' Operation2='MultiStreamNest' 

नोट, मैं एक नेस्टेड टाइप की गई संरचना में प्रोजेक्ट करने की कोशिश कर रहा हूं। अगर मैं Concat() से पहले x और y पर .ToList() को कॉल करता हूं तो यह ठीक काम करता है। एक और बिंदु के रूप में, मेरी संपत्तियों में से एक एक enum है, लेकिन मैं एक पूर्णांक रैपर संपत्ति का उपयोग कर इसे आवंटित कर रहा हूँ।

क्या कोई तरीका है जो मैं कर सकता हूं जो मैं सभी डेटा को स्मृति में खींचने के बिना करना चाहता हूं? या यह enum कारण विफलता है?

धन्यवाद,

टी

उत्तर

0

आप

var results = x.Union(y); 

साथ करने की कोशिश की है?

var requiredDocuments =     
       (from x in db.RequestTypes where (some condition) select x.RequiredDocuments) 
       .SelectMany(r => r).ToList<DataModel.RequiredDocument>() 
       .Concat(
       (from c in db.Categories where (some condition) select c.RequiredDocuments) 
       .SelectMany(r => r).ToList<DataModel.RequiredDocument>() 
       ) 
       .Concat(
       (from f in db.Fields where (some condition) select f.RequiredDocuments) 
       .SelectMany(r => r).ToList<DataModel.RequiredDocument>() 
       ); 
+0

बस इनमें से दूसरे की कोशिश की और लगता है कि पहले जैसा ही काम करता है, यानी मैं आशा करता हूं कि काम नहीं करता है (मेरी ओर से @ Arion की पोस्ट पर मेरी टिप्पणी देखें। –

+0

... जिसे अब हटा दिया गया है। वैसे भी, डॉन ' यूनियन का उपयोग करके दिमाग का उपयोग करते हुए परिणाम सेट अलग-अलग होना चाहिए, लेकिन फिर मुझे अपवाद मिलता है "निर्दिष्ट 'ऑपरेशन संग्रह पर लागू नहीं किया जा सकता है निर्दिष्ट तर्क के परिणाम प्रकार।" जो मुझे विश्वास है क्योंकि विशिष्ट नेस्टेड को संभाल नहीं सकता संग्रह –

+0

यदि खाली है? यह कैसा व्यवहार है? – innovia

0

मैं एक IEnumerable में जोड़ या संघ के लिए नेविगेशन संपत्तियों की बहु सेट की कोशिश करते हुए समान समस्या थी, यहाँ कोड नमूना है अगर मैं सही तरीके से समझता हूं कि आप क्या करने की कोशिश कर रहे हैं, तो मैंने कई बार एक ही समस्या में भाग लिया है। निचली पंक्ति यह है कि, नेस्टेड अनुमानों वाले यूनियनों को समर्थन नहीं दिया जाता है और यदि आपको ऐसा करने की ज़रूरत है, तो आपको परिणामों को पहले ToList के साथ पूरा करना होगा।

+0

क्या यह आपकी समस्याग्रस्त बिट कोड या कामकाजी है? – Jerther

+0

क्योंकि यह कंसट को निष्पादित करने से पहले ToList को कॉल करता है, यह काम करना चाहिए। – Florian

0

:

Tiz

या

var x = (from a in SomeData 
where ... some conditions ... 
select new MyType 
{ 
    Property = a.Property, 
    ChildCollection = (from b in a.Children 
        select new MyChildType 
        { 
         SomeProperty = b.Property, 
         AnotherProperty = b.AnotherProperty 
        }).ToArray() //or DefaultIfEmpty 
}).Concat(
from a in SomeData 
where ... some other conditions ... 
select new MyType 
{ 
    Property = a.Property, 
    ChildCollection = (from b in a.Children 
        select new MyChildType 
        { 
         SomeProperty = b.Property, 
         AnotherProperty = b.AnotherProperty 
        }).ToArray() //or DefaultIfEmpty 
}); 
संबंधित मुद्दे