2011-11-14 60 views
2

我想從我的數據庫創建POCO列表。在POCO類有我想填充像這樣一個List<int>屬性:使用子查詢填充POCO列表 - LINQ來實現

public List<Pocos.MyTable> GetData() 
{ 
    using (EFContext c = new EFContext()) 
    { 
     var query = from t in c.MyTable 
        select new Pocos.MyTable() 
        { 
         MyId = t.MyId, 
         MyField = t.MyField, 
         MyRelationIds = t.MyRelations.Select(mr => mr.MyRelationId).ToList() 
        }; 

     return query.ToList(); 
    } 
} 

不幸的是我得到了「這種方法不能被翻譯成店表達」在查詢中ToList()。我可以在這裏很好地做到這一點嗎,還是必須執行大量後續查詢才能填充MyRelationIds屬性?

+0

你有直接使用'MyRelations'的問題嗎? –

回答

2

從我的代碼和描述中得知,如果試圖只使用MyRelations,那麼它不會被加載。然後,您在查詢過程中嘗試訪問MyRelationsIds。有兩種方法可以解決這個問題。我個人比較喜歡第一個:

  1. public virtual List<Relation> MyRelations替換您的MyRelations屬性。虛擬是一種慣例,在這之後,EF將創建一個代理,這將作爲一個懶惰屬性。即它會在您觸摸它時立即加載。
  2. 另一種方法是使用預先加載,使用它您不必更改簽名。 只需使用Include方法,告訴EF你想要加載哪些道具。 請參閱.Include("MyRelations")它告訴我,在此查詢過程中必須加載MyRelations。所以你可以稍後使用它們。如果你想有關係的唯一的ID,那麼你應該先兌現你的對象,然後做映射(注意:AsEnumerable()

    using (EFContext c = new EFContext()) 
    { 
        var query = from t in c.MyTable.Include("MyRelations").AsEnumerable() 
        select new Pocos.MyTable() 
        { 
         MyId = t.MyId, 
         MyField = t.MyField, 
         MyRelationIds = t.MyRelations.Select(mr => mr.MyRelationId).ToList() 
        }; 
    
        return query.ToList(); 
    } 
    
+0

@errorstacks感謝代碼的幫助,我在過去的5分鐘裏搞砸了:)看起來,列表和代碼標記之間存在一些衝突。 –

+0

哦,男人,就是這樣嗎?它沒有加載?我只是假設懶惰加載會踢,並確保關係加載。我剛剛提出了你的第二個建議(作爲一個快速勝出),它的工作原理。我想我需要閱讀更多關於這個東西..:| – Sprintstar

0

你嘗試刪除「.ToList()」從線路:

MyRelationIds = t.MyRelations.Select(mr => mr.MyRelationId).ToList() 

,所以它看起來是這樣的:

MyRelationIds = t.MyRelations.Select(mr => mr.MyRelationId) 

+0

這給了我'不能隱式轉換類型'System.Collections.Generic.IEnumerable '到'System.Collections.Generic.List '。存在明確的轉換(您是否缺少演員?)' – Sprintstar