2012-12-20 56 views
0

我試圖用Automapper將一些數據從SQL服務器自動投影到我的視圖模型中。通過Automapper將幾個序列自動投影到主ViewModel中

視圖模型我已經是:

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

較新的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()一致。