我们有以下数据模型:
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 ...
我们也遇到了单元测试的相关问题。通过填充离散表来设置方案要容易得多,然后查询视图。我们的内存数据表示不会为我们这样做,所以我们最终会填充视图的内存中表示。
所以我们要做的是查询视图,然后将结果破解为反映底层表的对象结构。似乎唯一的方法是对表进行单独的查询:
这看起来很复杂。这似乎是ORM世界中的常见问题。有没有人对1)如何对视图执行查询并让它在另一端填充表对象,或2)问题的不同模式或方法有任何见解?
答案 0 :(得分:1)
你看过AutoMapper了吗?
AutoMapper使用流畅的配置API来定义对象 - 对象映射策略。 AutoMapper使用基于约定的匹配算法来匹配源值和目标值。目前,AutoMapper面向模型投影场景,将复杂对象模型展平为DTO和其他简单对象,其设计更适合于序列化,通信,消息传递,或者只是域和应用层之间的反腐败层。
我最近一直在使用它来将LINQ实体转换为更简单,更扁平的对象,到目前为止它运行良好。