0

我正在尝试使用 Automapper 将一些数据从 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()));

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

我在这样的一些代码行上遇到的异常

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

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

当我使用简单的映射时,比如.Name.Category.NameSQL 表中检索或其他单项检索,它可以完美运行。我只需要在通过 Automapper 投影序列时访问多个项目。

4

1 回答 1

1

较新的Project().To()API 采用与“经典”API 完全不同的路线Mapper.Map()。我认为后者会在您的情况下运行,但是您当然不会受益于 SQL 的投影涓涓细流思想。

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

所以,Project().To()有点受限。在这种特殊情况下,补救措施可能是将 a 与其父级映射到Session模型。参考导航属性将与 OK 映射。WorkStationStaffMemberProject().To()

于 2012-12-21T07:20:07.677 回答