2017-04-21 31 views
2

如何在EF獲取數據並使用Automapper將其映射時對兒童運行查詢?如何在兒童中添加where子句並將其正確映射

讓我首先解釋一下情景,我有一個父母和孩子,他們都可以是活動的或不活動的。如果父母不活躍,則所有孩子都不活動,如果父母活躍,則一些孩子可以活躍或不活躍。 現在這個返回與孩子

return Mapper.Instance.Map<ObservableCollection<Parent>>(context.Parent.AsNoTracking().ProjectTo<ParentDTOWithChildren>(Mapper.Configuration)); 

父現在,這是我後,用活潑的孩子只有

Mapper.Instance.Map<ObservableCollection<Parent>>(context.Parent.AsNoTracking() 
     .Where(p => p.IsInactive != true) 
     .Select(parent => new 
     { 
      parent, 
      Children = parent.Children.Where(c => c.IsInactive != true) 
     }) 
     .ProjectTo<ParentDTOWithChildren>(Mapper.Configuration)); 

第二次嘗試產生正確的SQL查詢返回活躍的父母,但是映射呢沒有正確映射,孩子們得到所有的值,但父母沒有。 我發現,如果我手動選擇每個屬性,然後,家長得到的所有屬性,所以此工程

Mapper.Instance.Map<ObservableCollection<Parent>>(context.Parent.AsNoTracking() 
     .Where(p => p.IsInactive != true) 
     .Select(parent => new 
     { 
     parent.Id, 
     parent.Description, 
     parent.Information, 
     . . . 
     Children = parent.Children.Where(c => c.IsInactive != true) 
    }) 
    .ProjectTo<ParentDTOWithChildren>(Mapper.Configuration)); 

理想情況下,我想只選擇父(使用中間的例子),它應該知道如何映射它,但是直到我指定了每個我想要的屬性。映射配置是正確完成的,因爲第一個例子工作得很好,有沒有更好的方法來選擇(映射​​)從該匿名類型到我的DTO的所有屬性?

非常感謝。

編輯

這是使它工作,而不是匿名類型的選擇的

服務來獲取數據。

Mapper.Instance.Map<ObservableCollection<Parent>> 
(context.Parent.AsNoTracking().Where(p => p.IsInactive != true) 
.ProjectTo<ParentDTOWithChildren>(Mapper.Configuration, new {excludeInactive = true})); 

映射

var excludeInactive = false; 
CreateMap<Parent, ParentDTOWithChildren>() 
.ForMember(p => p.Children, opt => opt.MapFrom(parent => parent.Children.Where(child => !excludeInactive || child.IsInactive != true))) 
.ReverseMap(); 
+0

發佈示例類和AM配置可能會有所幫助。 –

回答

2

附註 - 如果你正在使用AutoMapper的靜態實例,擺脫 「Mapper.Instance」 以及您在 「Mapper.Configuration」 通過的。那些是多餘的。

到你原來的問題 - 沒有。但是,您可以映射到代表您的匿名類型的中間型「ParentWithChildren」,所以它看起來是這樣的:

Mapper.Map<ObservableCollection<Parent>>(context.Parent.AsNoTracking() 
    .Where(p => p.IsInactive != true) 
    .Select(p => Mapper.Map<ParentWithChild>(p)) 
.ProjectTo<ParentDTOWithChildren>()); 

你的父母的配置 - > ParentWithNoChildren將包括兒童片作爲MapFrom配置。

一般而言,而不是映射到一個匿名類型,創建一個明確的類型(即使它是未知的EF),映射到它,然後執行任何附加的映射:

EF型 - >中間體模型 - > DTO

+0

感謝您的回覆,我發現我根本不必使用匿名類型(或者中間模型,我嘗試過但是拋出異常)。在我引起您的注意的同時,您是否可以查看我的編輯,以查看我的解決方案中是否存在潛在的危險?謝謝您的注意,這些冗餘參數很快就會被移除。 – adminSoftDK

+0

編輯很有意義! –