2011-06-16 92 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