【发布时间】:2010-07-12 12:57:31
【问题描述】:
众所周知,大多数应用程序都有数据访问层,通常使用存储库类。通常我们希望存储库使用 强类型 对象,例如
interface IUserRespository
{
User GetUserByID(int id);
void AddUser(User u);
... and so on
}
但是,有时我们希望对数据库进行更复杂的查询,这涉及到分组和聚合。例如,我们想要获取所有用户的所有订单的总值(结果集将只有两列:UserName 和 TotalAmount)。现在我的问题是:存储库方法会是什么样子? LINQ to entity 网上有几十个例子如何使用 sum 和 group by 进行查询,但所有这些例子都返回匿名类型。那么,我们的存储库如何返回这样的查询结果呢?另一个常见的答案是:将它包装在一个类中。所以该方法可能如下所示:
interface IUserRepository
{
UserOrderTotal[] GetOrderTotalsForAllUsers();
}
UserOrderTotal 必须是一个小类,具有查询返回的两个属性:UserName 和 TotalAmount。此类将在我们的一个 .cs 文件中的某处定义。这真的是唯一的解决方案吗?它看起来很糟糕,因为它在主要实体模型(edmx)之外的某个地方引入了一个新的“临时”模型。理想情况下,我想用一个名为 TotalAmount 的新字段来丰富我的用户模型,该字段只会在此查询中填充,因此界面可能如下所示:
interface IUserRepository
{
User[] GetOrderTotalsForAllUsers();
}
它会返回所有字段设置为默认值的用户实体,名称和总计金额除外。我遇到的问题是我无法使用未映射到数据库列的字段来编译模型。我收到错误错误 3004:从第 2226 行开始映射片段时出现问题:没有为 Set User 中的属性 User.TotalAmount 指定映射。在以下情况下,具有键(PK)的实体将不会往返:实体类型为 [FPSoMeterModel.User ]
我做错了吗?这个问题是微不足道的,还是我问错了问题?为每个涉及聚合的查询(!)创建一个包装类似乎有点荒谬。似乎整个 LINQ 的东西都鼓励人们不要使用多层架构,而是在呈现数据的同一层中构建查询......你们如何处理这个问题,你使用“存储库”类吗? LINQ,如果是 - 你如何返回复杂的查询结果?
【问题讨论】:
标签: design-patterns linq-to-entities repository-pattern