我使用 AutoMapper 進行映射。我需要使用 Distinct & Select。但是現在我的映射不起作用并顯示“缺少型別映射配置或不受支持的映射”
我能做什么?
cfg.CreateMap<SearchHistory, SearchDashBoardDto>();
var searchList = _unitOfWork.SearchRepository.GetSearchHistory(userId, sessionId)
.Select(x => new { x.SearchText, x.Url })
.Distinct();
return _mapper.Map<List<SearchDashBoardDto>>(searchList);
uj5u.com熱心網友回復:
您正在嘗試將匿名型別映射到 DTO。舊版本的 Automapper 將通過選項來支持這一點,以嘗試解決未知的映射,但逐漸被淘汰。我相信仍然有支持DynamicMap()/w Dmitriy 的答案。
Automapper 可以完全使用ProjectTo. 您需要為它提供一個 MapperConfiguration 以說明如何將 SearchHistory 轉換為 SearchDashBoardDto,并確保您的搜索存盤庫回傳IQueryable<SearchHistory>而不是類似IEnumerable<SearchHistory>.
假設您的 DTO 有一個 SearchText 和 Url 列,其命名約定與物體相同,一個具有本地配置的示例:
var config = new MapperConfiguration(cfg => cfg.CreateMap<SearchHistory, SearchDashBoardDto>());
var searchList = _unitOfWork.SearchRepository
.GetSearchHistory(userId, sessionId)
.ProjectTo<SearchDashBoardDto>(config)
.Distinct()
.ToList();
ProjectTo擴展方法需要映射器配置。這可以集中配置并作為依賴項傳入,或者按需構建或通過工廠方法構建。(我通常將它們作為靜態方法放在視圖模型上)
編輯:或者,如果您遇到使用Select匿名型別的麻煩,您也可以填充您的 ViewModel:
var searchList = _unitOfWork.SearchRepository.GetSearchHistory(userId, sessionId)
.Select(x => new SearchDashBoardDto
{
SearchText = x.SearchText,
Url = x.Url
}).Distinct()
.ToList();
如果您的存盤庫正在回傳IEnumerable<SearchHistory>或類似,這將不起作用,并且從性能角度來看它肯定不是理想的,因為它會回傳整個搜索歷史物體。(您只關心 2 個欄位和不同的結果)以上可以幫助構建更有效的查詢,讓 DB 呼叫只回傳您想要回傳的資料。如果存盤庫正在恢復IEnumerable或IList等,而不是IQueryable,那么我的建議是,要么跨越移動這個使用IQueryable或擺脫庫的全在一起,只是使用DbContext/DbSet秒。
uj5u.com熱心網友回復:
這應該有效。
_unitOfWork.SearchRepository.GetSearchHistory(userId, sessionId)
.Select(x => new { x.SearchText, x.Url })
.Distinct()
.Select(s => _mapper.Map<SearchDashBoardDto>(s))
.ToList()
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/386292.html
標籤:C# asp.net-mvc 实体框架 自动映射器
