2010-05-28 15 views
7

इन वस्तुओं मान लिया जाये का प्रक्षेपण ...LINQ संस्थाओं के लिए नेस्टेड सूची

class MyClass 
{ 
    int ID {get;set;} 
    string Name {get;set;} 
    List<MyOtherClass> Things {get;set;} 
} 

class MyOtherClass 
{ 
    int ID {get;set;} 
    string Value {get;set;} 
} 

मैं कैसे संस्थाओं के लिए एक LINQ करते हैं क्वेरी, नीचे की तरह एक प्रक्षेपण का उपयोग कर, कि मुझे एक सूची दे देंगे? यह एक IEnumerable के साथ ठीक काम करता है (MyClass.Things संभालने एक IEnumerable है, लेकिन मैं सूची का उपयोग करने की आवश्यकता है) मदद के लिए

MyClass myClass = (from MyClassTable mct in this.Context.MyClassTableSet 
         select new MyClass 
         { 
          ID = mct.ID, 
          Name = mct.Name, 
          Things = (from MyOtherClass moc in mct.Stuff 
             where moc.IsActive 
             select new MyOtherClass 
             { 
              ID = moc.ID, 
              Value = moc.Value 
             }).AsEnumerable() 
         }).FirstOrDefault(); 

धन्यवाद!

उत्तर

14

आप नहीं है। आपको एल 2 ओ में यह हिस्सा करना है।

तो तुम कर सकता है:

var q = (from MyClassTable mct in this.Context.MyClassTableSet 
     select new // note anonymous type; important! 
     { 
      ID = mct.ID, 
      Name = mct.Name, 
      Things = (from MyOtherClass moc in mct.Stuff 
         where moc.IsActive 
         select new MyOtherClass 
         { 
          ID = moc.ID, 
          Value = moc.Value 
         } 
      }).AsEnumerable(); 

MyClass myClass = (from mct in q 
        select new MyClass 
        {     
         ID = mct.ID, 
         Name = mct.Name, 
         Things = mct.Things.ToList() 
        }).FirstOrDefault(); 

वहाँ एक क्वेरी में यह करने के लिए कोई रास्ता नहीं है।

+0

धन्यवाद, मैंने अभी भी यह पता लगाया है। – ctorx

1

मुझे यकीन नहीं है कि आप वास्तव में क्या पूछ रहे हैं, लेकिन List<T>IEnumerable<T> लागू करता है (जो कि एक अनुक्रमिक अनुक्रम के लिए एक इंटरफ़ेस है)।

एक कोड है कि आपके प्रक्षेपण करते हैं और चीजें एक IEnumerable के बजाय एक सूची ToList() ऑपरेटर, जो किसी भी IEnumerable<T> इस से एक List<T> बनाता का प्रयोग करेंगे होना होगा:

MyClass myClass = (from MyClassTable mct in this.Context.MyClassTableSet 
         select new MyClass 
         { 
          ID = mct.ID, 
          Name = mct.Name, 
          Things = (from MyOtherClass moc in mct.Stuff 
             where moc.IsActive 
             select new MyOtherClass 
             { 
              ID = moc.ID, 
              Value = moc.Value 
             }).ToList() 
         }).FirstOrDefault(); 
+1

ToList (

class MyClass { ... List<MyOtherClass> m_Things = new List<MyOtherClass>(); public List<MyOtherClass> Things { get { if (ThingsForLinq != null) { m_Things = ThingsForLinq.ToList(); ThingsForLinq = null; } return m_Things; } set { m_Things = value; } } public IEnumerable<MyOtherClass> ThingsForLinq { get; set; } } 

तो तुम एफई LINQ क्वेरी में ThingsForLinq उपयोग करने के लिए) LINQ से Entities क्वेरी पर समर्थित नहीं है, इसलिए मैंने इस सवाल से पूछा है। – ctorx

+0

क्या इसके लिए कोई संदर्भ है? एमएसडीएन के स्वयं के LINQ से इकाइयों से पता चलता है कि आप वास्तव में ToList का उपयोग कर सकते हैं। http://msdn.microsoft.com/en-us/library/bb896246.aspx?ppud=4 – user7116

+0

आप किसी क्वेरी के परिणाम पर ToList() का उपयोग कर सकते हैं, लेकिन अब एक क्वेरी के भीतर। आपके लिंक के उदाहरण में, ToList() को LINQ अभिव्यक्ति के अंत में जोड़ा जाता है। मेरे कोड में, यह अभिव्यक्ति के भीतर एम्बेडेड है, इसलिए समर्थित नहीं है। – ctorx

-2

यह उत्तर सहायक था, लेकिन इस तरह मैं यह करता हूं। यह पीओसीओ में परिवर्तित हो जाता है, और असीमित नेस्टेड सूचियों का समर्थन कर सकता है। बहुत सरल लेकिन शक्तिशाली:

Product product = new Product(); 
List<CoverageCondition> covCondList = null; 
CoverageCondition covCond = null; 
Question question = null; 
List<Question> questList = null; 

var prod = db.PRODUCTs.Include("COVERAGE_CONDITION.QUESTIONs").Where(p => p.PRODUCT_CODE == productCode).FirstOrDefault(); 

product.ProductId = prod.PRODUCT_ID; 
product.ProductCode = prod.PRODUCT_CODE; 
product.ProductName = prod.PRODUCT_NAME; 

// go through coverage conditions 
covCondList = new List<CoverageCondition>(); 
product.CoverageConditions = covCondList; 
foreach (COVERAGE_CONDITION cc in prod.COVERAGE_CONDITION) 
{ 
    covCond = new CoverageCondition(); 
    covCond.ConditionId = cc.COV_CONDITION_ID; 
    covCond.ConditionCode = cc.COV_CONDITION_CODE; 
    covCond.ConditionName = cc.COV_CONDITION_NAME; 
    covCondList.Add(covCond); 

    // go through questions for each coverage condtion, if any 
    questList = new List<Question>(); 
    covCond.Questions = questList; 
    foreach (QUESTION q in cc.QUESTIONs) 
    { 
     question = new Question(); 
     question.QuestionId = q.QUESTION_ID; 
     question.QuestionCode = q.QUESTION_CODE; 
     question.QuestionText = q.QUESTION_TEXT; 
     questList.Add(question); 
    } 
} 
0

कृपया निम्नलिखित समाधान देखें। आप अपने वर्ग में सूची और IEnumerable के लिए खेतों को अलग कर सकते हैं:

MyClass myClass = (from MyClassTable mct in this.Context.MyClassTableSet 
        select new MyClass 
        { 
         ID = mct.ID, 
         Name = mct.Name, 
         ThingsForLinq = (from MyOtherClass moc in mct.Stuff 
            where moc.IsActive 
            select new MyOtherClass 
            { 
             ID = moc.ID, 
             Value = moc.Value 
            }).AsEnumerable() 
        }).FirstOrDefault(); 

और बाद में हालात का उपयोग करें::

myClass.Things.Add(...) 
संबंधित मुद्दे