我發現了兩種解決方案來忽略非映射屬性,但one of them也忽略了常規映射,並且second不能與QueryableExtensions一起使用以返回一個IQueryable(不知道爲什麼,但我得到錯誤參數類型不匹配)。如何使AutoMapper:忽略非映射屬性,包括常規映射並使用QueryableExtensions
有沒有人有解決方案來忽略包含上述兩個方面的非映射屬性?
我發現了兩種解決方案來忽略非映射屬性,但one of them也忽略了常規映射,並且second不能與QueryableExtensions一起使用以返回一個IQueryable(不知道爲什麼,但我得到錯誤參數類型不匹配)。如何使AutoMapper:忽略非映射屬性,包括常規映射並使用QueryableExtensions
有沒有人有解決方案來忽略包含上述兩個方面的非映射屬性?
問題解決。正是在這行代碼
.ForMember(p => p.Gender, opt => opt.MapFrom(c => c.GenderCode))
其中p.Gender是int類型int類型的GenderCode和?所以改爲
.ForMember(p => p.Gender, opt => opt.MapFrom(c => c.GenderCode ?? 0))
解決了這一問題。什麼使得難以排除故障是上面的映射代碼正在工作,直到我嘗試返回IQueryable。
使用QueryableExtensions時,必須明確進行某種類型的轉換,例如int?
至int
。這可能是「參數類型不匹配」異常的來源。
如果你有很多需要類型轉換的屬性 - 就像你有許多其他的屬性,你發現你在做c.MyVariable ?? 0
- 你可以定義一個轉換規則,而不必明確說明每個屬性。
通常,要在Automapper中進行類型轉換,您可以使用ConvertUsing
,但是在使用QueryableExtensions時,您需要改爲使用ProjectUsing
。
您可以使用下面的行,很會照顧從int?
所有映射到int
,而無需顯式指定每個屬性的映射:
cfg.CreateMap<int?, int>().ProjectUsing(src => src.HasValue ? src.Value : 0);
只是參考意見,不IQueryable的工作與其他AutoMapper地圖?你不想「意識到」IQueryable的結果,而不是試圖複製到DTO?將某些東西映射到IQueryable看起來並不像您想要執行的操作,因爲您的DTO通常會跨越流程邊界或作爲JSON提供服務。 – CodeMonkeyKing 2013-04-20 19:48:43
您使用的是什麼版本的AutoMapper,以及您映射的是哪種類型的IQueryable表達式? LINQ to SQL,LINQ to EF,其他? – CodeMonkeyKing 2013-04-20 20:13:20
@CodeMonkeyKing在閱讀(https://github.com/AutoMapper/AutoMapper/issues/163)後,我已經在今天早些時候更新到最新的2.2.1,但沒有運氣(仍然是同樣的錯誤)。 IQueryable可以與其他地圖一起使用,包括使用「IgnoreAllUnmap」地圖。我不想「實現」IQueryable,否則它會帶來一堆不必要的數據,因爲我將從存儲庫中的GetAll()或Table()調用。 – 2013-04-20 20:22:24