2013-11-04 37 views
1

有什麼問題在下面的代碼顯示錯誤不能在LINQ構建以查詢實體

public IList<specialisation_sub> GetAllActiveSpecialisation_Sub(
    int specialisationid) 
{ 
    var queryList = _db.specialisation_sub 
         .Where(obj => obj.isdeleted == false && 
          obj.specialisationid == specialisationid) 
         .Select(obj => new specialisation_sub() 
         { 
          Id = obj.Id, 
          name = obj.name 
         }).ToList(); 

    return queryList.ToList<specialisation_sub>(); 
} 

我也需要選擇只有兩列以上

下面顯示錯誤

實體或複雜類型'JobPortalModel.specialisation_sub'不能在LINQ to Entities查詢中構造。

+1

你確定要打兩次ToList嗎? – Euphoric

+0

你在specialisation_sub構造函數或屬性中有一些代碼嗎? –

回答

5

您不能將結果投影到任意CLR類型中。你可以,但是,項目到一個匿名類型:

var queryList = _db.specialisation_sub 
        .Where(obj => obj.isdeleted == false && obj.specialisationid == specialisationid) 
        .Select(obj => new { Id = obj.Id, name = obj.name }) 
        .ToList(); 

如果有必要,可以將結果轉換爲另一種類型:

return queryList.Select(o => new specialisation_sub { Id = o.Id, name = o.name }) 
       .ToList(); 

如果你做這樣的轉換,隨意更換首先ToList()AsEnumerable()呼叫,以避免分配不必要的中間名單。

我的答案和@Tilak's之間的關鍵區別在於,我的數據庫只會從數據庫中檢索所需的兩列,而@Tilak的答案將檢索所有列,儘管在最終結果中只使用其中的兩列。取決於每個實體的大小,這可能是大量的內存和/或IO開銷。

+0

爲什麼我們不能將結果投影到任意CLR類型? –

+0

這是實體框架的限制。我認爲這是因爲可能會在投影中執行額外的服務器端操作,EF團隊希望通過確保所有結果類型直接映射到EF實體或簡單結構類型來保持簡單。由於某些操作是在服務器上執行的,而不是在CLR中執行的,因此它們不一定能夠模擬任意類型的客戶端行爲,這些類型可能在構造函數和/或屬性設置器中具有自變量邏輯。 –

相關問題