我正在尝试从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.Name
或SQL表中的其他单项检索时,它可以完美地运行。我需要的是通过Automapper投影序列时访问多个项目。
答案 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
及其父级WorkStation
和StaffMember
映射到模型。参考导航属性将使用Project().To()
映射确定。