2011-06-16 69 views
0

我已經使用了實體框架併爲我的數據庫生成了edmx。生成的模板類表示每個表。我有一個生成的類「Table」,我已經從其中12個屬性中拷貝了4個到一個新的接口「ITableModel」。如何將EF4.1表類轉換爲派生視圖類?

var tables = (from t in db.Tables 
         orderby t.DateReceived descending 
         select t).Take(100); 

var list = tables.AsEnumerable().Cast<ITableModel>().ToList(); 

正如您可以猜測的那樣,演員將拋出一個無效播放異常。這裏的目標是刪除我需要傳遞給我的視圖(MVC3)的信息並創建表示該信息的視圖類。從我所收集到的信息來看,這是最好的做法,但是我用這種鑄造物抵住牆壁。任何幫助,將不勝感激!

+0

我有一個刪除的評論點我automapper ...這會對我工作? – 2011-06-16 16:20:07

+0

@Nathan刪除了他的帖子。使用Automapper的想法是正確的,但是查詢必須以不同的方式寫入。加載實體後必須使用Automapper。 – 2011-06-16 16:45:01

+0

啊,呃...我會用你的方法 - 它需要更多的工作,但會更有效率。 – 2011-06-16 16:48:41

回答

1

如果你不需要表中的所有數據,那麼就沒有必要從數據庫中傳輸它們。您可以使用:

public class MyProjection : ITableModel 
{ 
    public int SomeField { get; set; } 
    public string SomeField2 { get; set; } 
} 

,並致電查詢爲:

var list = db.Tables 
       .OrderByDescending(t => t.DateReceived) 
       .Take(100) 
       .Select(t => new MyProjection 
        { 
         SomeField = t.SomeField, 
         SomeField2 = t.SomeField2 
        }) 
       .ToList(); 

Cast僅如果重寫操作鑄造是可能的,但它需要具體的類型,因爲運營商必須創建目標類型的實例。

+0

拉迪斯拉夫,謝謝你的回答!你能否澄清一下:「只有當你覆蓋操作員才能投射」時? - 我將爲數百個表執行此操作,並且會討厭必須手動將列分配給對象屬性(我已在所有ActionResults中使用LINQ!) – 2011-06-16 15:29:13

+0

如果要優化加載,則確實需要手動爲每個表執行操作。 – 2011-06-16 16:43:40

+0

拉迪斯拉夫,我已經接受你的答案,再次感謝! – 2011-06-16 16:44:11