通过Automapper将几个序列自动插入主ViewModel

时间:2012-12-20 07:35:59

标签: c# linq linq-to-sql automapper automapper-2

我正在尝试从SQL服务器自动投影,并将一些数据自动映射到我的视图模型中。

我的视图模型是:

public sealed class WorkstationViewModel
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string OccupiedByName { get; set; }
}

我正在尝试使用的代码是:

Mapper.CreateMap<Workstation, WorkstationViewModel>()
  .ForMember(T => T.OccupiedByName, T => T.MapFrom(W =>
    W.Sessions.AsQueryable().Select(E => E.StaffMember.Name).SingleOrDefault()));

两个属性IdName是自动投影的,因为它们在Workstation类中具有相同的名称。

我在这样的代码行上得到的例外

var model = WorkstationsRepository.GetAll().Project()
           .To<WorkstationViewModel>().SingleOrDefault();

是一些奇怪的object reference is null异常,并且在堆栈跟踪的顶部有一些automapper的CreateExpression<>方法,它们给出了一个结论,即automapper无法生成一个好的表达式来将其转换为SQL代码

当我使用简单的地图,例如.Name.Category.Name或SQL表中的其他单项检索时,它可以完美地运行。我需要的是通过Automapper投影序列时访问多个项目。

1 个答案:

答案 0 :(得分:1)

较新的Project().To() API采用与“经典”Mapper.Map() API完全不同的路线。我认为后者会在你的情况下运行,但当然你不会受益于SQL的投射诡计。

Project().To()期间,AutoMapper尝试从涉及的类型中获取MemberInfo s(反射),它用于创建lambda表达式。这意味着映射中的源属性必须是源类型的成员。很明显,W.Sessions.AsQueryable().Select(...不是Workstation的成员。因此,沿着AutoMapper行的某个地方碰到了null memberinfo。

所以,Project().To()有点受限制。在此特定情况下,补救措施可能是将Session及其父级WorkStationStaffMember映射到模型。参考导航属性将使用Project().To()映射确定。