LINQ to SQL查询视图以填充对象模型

时间:2010-07-12 20:15:52

标签: sql linq-to-sql orm

我们有以下数据模型:

CalendarAppointment 1 <------> * AppointmentRole * <--------> 1 Person (or Group)

日历约会可以有多个与之关联的人。每个人可以扮演不同的角色(参加,驾驶,接送或下车)。 (一个人也可以是一个团体的成员,团体也可以与约会相关联,但这是为了这个问题的额外信用)。

在呈现日历的Web请求开始时,我们希望在给定的日期范围内提取与登录成员相关的所有约会。

“驾驶”表是日历约会。渲染看起来像:

foreach (var appointment in dataContext.Appointments.Where(person has appointment role)]
{
   ... render appointment ...
   foreach (role)
      ... render role...

目前,这是通过LINQ to SQL查询我们在SQL Server中定义的用于连接CalendarAppointment,AppointmentRole和Person的列的视图。这是进行查询的最佳方式,但是一旦数据在对象世界中,使用映射到构成视图的组成表的对象会更方便。

所以在对象世界中,我想处理......

 class CalendarAppointment
 {
     IEnumerable<AppointmentRole> Roles ...

 ...

 class AppointmentRole
 {
    Person Person ...

我们也遇到了单元测试的相关问题。通过填充离散表来设置方案要容易得多,然后查询视图。我们的内存数据表示不会为我们这样做,所以我们最终会填充视图的内存中表示。

所以我们要做的是查询视图,然后将结果破解为反映底层表的对象结构。似乎唯一的方法是对表进行单独的查询:

  1. 查询约会角色表
  2. 使用第一个查询中的约会外键集查询日历约会。
  3. 使用第一个查询中的一组人员外键查询人员表。
  4. 这看起来很复杂。这似乎是ORM世界中的常见问题。有没有人对1)如何对视图执行查询并让它在另一端填充表对象,或2)问题的不同模式或方法有任何见解?

1 个答案:

答案 0 :(得分:1)

你看过AutoMapper了吗?

  

AutoMapper使用流畅的配置API来定义对象 - 对象映射策略。 AutoMapper使用基于约定的匹配算法来匹配源值和目标值。目前,AutoMapper面向模型投影场景,将复杂对象模型展平为DTO和其他简单对象,其设计更适合于序列化,通信,消息传递,或者只是域和应用层之间的反腐败层。

我最近一直在使用它来将LINQ实体转换为更简单,更扁平的对象,到目前为止它运行良好。