2014-04-25 125 views
1

我收到一個異常,LINQ to Entities不能識別該方法。我明白這是因爲我在Select語句中使用了toList()。LINQ to Entities不識別該方法

var study= db.StudySessions.Where(s => s.StudySessionId == sessionId).Select(session => new StudySessionDTO 
       { 
        Name = session.Name, 
        TypeCode = session.TypeCode, 
        Tutors = session.Tutors.Select(t => new TutorDTO 
        { 
         FirstName = t.FirstName, 
         LastName = t.LastName 


        }).ToList() 

       }).FirstOrDefault(); 

我明白這是因爲我在Select語句中使用了toList()。但是,如果我刪除它,我會得到一個語法錯誤。我必須使用投影,否則當我嘗試返回它時,會遇到json引用循環問題。任何想法如何解決這個問題。

+0

如果關閉延遲加載,則可以使用JSON序列化實體。只需「包含()」任何你需要的東西。 –

回答

1

由於您檢索一個項目,你可能會迫使通過調用AsEnumerable讀入內存,並經過做投影,像這樣:

var study= db.StudySessions 
    .Where(s => s.StudySessionId == sessionId) 
    .AsEnumerable() // The rest of the query happens in memory 
    .Select(session => new StudySessionDTO { 
     Name = session.Name 
    , TypeCode = session.TypeCode 
    , Tutors = session.Tutors.Select(
      t => new TutorDTO { 
       FirstName = t.FirstName 
      , LastName = t.LastName 
      }).ToList() 
    }).FirstOrDefault(); 

因爲由sessionId過濾數據庫中的情況,這會不會所有的數據強制到內存中。

+0

儘管如此,仍然不是最好的表現。 'StudySessionId'看起來不像表上的主鍵那麼可能返回多個。此外,對於每一個「Tutors」都需要單獨查詢,它會帶回所有Tutor屬性,而不是所需的屬性。 – Ocelot20

0

項目到一個匿名對象,然後項目到您的DTO:

// Simplified to keep some important parts... 
var study= db.StudySessions 
      .Select(session => new // Anonymous Type 
      { 
       Tutors = session.Tutors 
           .Select(t => new TutorDTO 
           { 
            FirstName = t.FirstName 
           }) 
      }) 
      .ToList() // Now it's in memory. 
      .Select(session => new StudySessionDTO 
      { 
       Tutors = session.Tutors.ToList() 
      }); 
相關問題