2010-05-28 127 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,但我需要使用List)提前

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

你不知道。你必須在L2O中完成這部分。

所以,你可以這樣做:

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 2010-05-28 17:18:56

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( )不支持LINQ to Entities Query,這就是爲什麼我提出了這個問題。 – ctorx 2010-05-28 17:01:46

+0

有沒有這方面的一些參考? MSDN自己的LINQ to Entities顯示你實際上可以使用ToList。 http://msdn.microsoft.com/en-us/library/bb896246.aspx?ppud=4 – user7116 2010-05-28 17:06:05

+0

您可以使用ToList()查詢的結果,但現在在查詢中。在鏈接的例子中,ToList()被添加到LINQ表達式的末尾。在我的代碼中,它嵌入在表達式中,因此不受支持。 – ctorx 2010-05-28 17:10:03

-2

這個答案是有幫助的,但這是我如何做到這一點。這將轉換爲POCO,並且可以支持無限制的嵌套列表。非常簡單但功能強大:

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領域:

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; } 
} 

所以,你必須在EF LINQ查詢使用ThingsForLinq:

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(...)