您正在尝试将匿名类型映射到 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 或完全摆脱存储库并仅使用@987654334 @/DbSets.