【问题标题】:How Can I Map Select With AutoMapper如何使用 AutoMapper 映射选择
【发布时间】:2022-01-18 18:41:03
【问题描述】:

我使用 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);

【问题讨论】:

    标签: c# asp.net-mvc entity-framework automapper


    【解决方案1】:

    您正在尝试将匿名类型映射到 DTO。旧版本的 Automapper 将通过选项来支持这一点,以尝试解决未知映射,但逐渐被淘汰。我相信仍然支持DynamicMap(),这应该可以工作/w Dmitriy的回答。

    Automapper 可以使用ProjectTo 完全管理这个问题。您需要为其提供 MapperConfiguration,说明如何将 SearchHistory 转换为 SearchDashBoardDto,确保您的搜索存储库返回 IQueryable&lt;SearchHistory&gt; 而不是 IEnumerable&lt;SearchHistory&gt; 之类的东西。

    假设您的 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&lt;SearchHistory&gt; 或类似的东西,这将不起作用,并且从性能角度来看肯定不是理想的,因为它会返回整个搜索历史实体。 (您只关心 2 个字段和不同的结果)以上可以帮助构建更有效的查询,让 DB 调用只返回您想要返回的数据。如果存储库返回IEnumerableIList 等而不是IQueryable,那么我的建议是将其移至使用IQueryable 或完全摆脱存储库并仅使用@987654334 @/DbSets.

    【讨论】:

      【解决方案2】:

      这应该可行。

      _unitOfWork.SearchRepository.GetSearchHistory(userId, sessionId)
                                      .Select(x => new { x.SearchText, x.Url })
                                      .Distinct()
                                      .Select(s => _mapper.Map<SearchDashBoardDto>(s))
                                      .ToList()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-25
        • 2013-05-09
        相关资源
        最近更新 更多