2011-07-31 31 views
1

我不确定这是否可能与实体框架,但我复制了太多的代码填充对象。LINQ w /实体框架 - 填充对象

目前我的方法做这样的事情:

return (from s in context.some_table 
    join u in context.user_table on s.user_id equals u.id 
    where s.id == someId 
    select new MyObject() 
    { 
     TableColumn = s.some_column, 
     User = new MyUser() 
     { 
      Username = u.username, 
      Id = u.id, 
     } 
    }.FirstOrDefault(); 

我刚刚输入了这一点作为一个例子。我有很多查询,其中包含有关用户的信息(不仅仅是在该示例中)。因此,在我所有的查询中,我都放入了相同的代码块。如果我有100个方法使用该代码块,并且我想添加另一个返回的列,那么我必须更新100个方法。屁股疼痛。

我想要做的是让用户对象填充一个可重用的方法。这种方式添加/删除列返回只需要在一个地方改变。像:

return (from s in context.some_table 
    join u in context.user_table on s.user_id equals u.id 
    where s.id = someId 
    select new MyObject() 
    { 
     TableColumn = s.some_column, 
     User = FillUser(u) 
    }.FirstOrDefault(); 

FillUser将是方法。当然这不适用于实体框架。

有什么我可以做的吗?我当然可以返回整个用户表,但这是比我需要的更多的信息,所以这是一种浪费。

我使用.NET 4.0,如果有帮助。

回答

2

实体框架是ORM工具,因此它的主要目的是定义从数据库到对象的映射并基于该映射加载实体。显然,如果您需要100次相同的用户投影,则可以使用映射数据库视图,自定义defining query或自定义query view。您正在滥用投射,而不是创建可重复使用的映射。

+0

如果使用表中的数据子集创建对象而不是从它们返回所有数据会滥用它,那么Microsoft应该真的更新它们的示例。 – GregInWI2

+1

他们为什么要这样做?如果您不需要重复100次,投影就可以。如果你需要使用它100倍,那么'QueryView'就是例子,这就是为什么'QueryView'存在的原因 - 具有可重用性。 –

+0

@ GregInWI2:你真的使用表映射。 – Naor