代码之家  ›  专栏  ›  技术社区  ›  Rob

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

  •  1
  • Rob  · 技术社区  · 14 年前

    我们有以下数据模型:

    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中定义的视图进行查询来完成的,这个视图将连接来自calendarepointment、appointmentrole和person的列。这是进行查询的最佳方法,但是一旦数据位于对象世界中,就可以更方便地处理映射到构成视图的组成表的对象。

    所以在对象世界里,我想处理…

     class CalendarAppointment
     {
         IEnumerable<AppointmentRole> Roles ...
    
     ...
    
     class AppointmentRole
     {
        Person Person ...
    

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

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

    1. 查询约会角色表
    2. 使用第一个查询中的约会外键集查询日历约会。
    3. 使用第一个查询中的Person外键集查询Person表。

    这似乎相当复杂。这似乎是ORM世界中的一个常见问题。是否有人对1)如何对视图执行查询并让它填充另一侧的表对象,或2)解决问题的不同模式或方法有任何见解?

    1 回复  |  直到 14 年前
        1
  •  1
  •   Andy Robinson    14 年前

    你看过吗 AutoMapper ?

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

    我最近一直在使用它将LINQ实体转换为更简单、更平坦的对象,到目前为止它工作得很好。