【问题标题】:How get AutoMapper to: ignore non mapped properties, include conventional mapping and work with QueryableExtensions如何让 AutoMapper:忽略非映射属性,包括常规映射和使用 QueryableExtensions
【发布时间】:2013-04-13 22:18:39
【问题描述】:

我找到了两种忽略非映射属性的解决方案,但 one of them 也忽略了常规映射,并且 second 不能与 QueryableExtensions 一起返回 IQueryable(不知道为什么,但我明白了错误参数类型不匹配)。

是否有人有解决方案来忽略涵盖上述两个方面的非映射属性?

【问题讨论】:

  • 只是信息性评论,IQueryable 是否适用于其他 AutoMapper 地图?您不想“实现” IQueryable 的结果而不是尝试复制到 DTO 吗?将某些内容映射到 IQueryable 似乎不像您想要做的,因为您的 DTO 通常跨越流程边界或作为 JSON 提供。
  • 您使用的是什么版本的 AutoMapper,您映射的是什么类型的 IQueryable 表达式? LINQ to SQL,LINQ to EF,其他?
  • @CodeMonkeyKing 我今天早些时候已经在阅读 (github.com/AutoMapper/AutoMapper/issues/163) 后更新到最新的 2.2.1,但没有运气(仍然是同样的错误)。 IQueryable 适用于其他地图,包括使用“IgnoreAllUnmapped”地图。我不想“实现” IQueryable,否则它会带来一堆不必要的数据,因为我将从存储库中的 GetAll() 或 Table() 调用。
  • 我将我的测试平台回滚到 2.1.262 以尝试复制您的问题,看看我是否可以让 IgnoreAllNonExisting 工作。
  • 这是我给你的唯一建议:尝试在未映射的属性名称上使用循环内的 CanResolveValue():if (existingMaps.GetPropertyMaps().Any(pm => pm.CanResolveValue() && pm.SourceMember.Name == property)) { expression.ForMember(property, opt => opt.Ignore()); }

标签: c# automapper iqueryable


【解决方案1】:

问题解决了。就是在这行代码里

.ForMember(p => p.Gender, opt => opt.MapFrom(c => c.GenderCode))

其中 p.Gender 是 int 类型,而 GenderCode 是 int? 类型。所以改成

.ForMember(p => p.Gender, opt => opt.MapFrom(c => c.GenderCode ?? 0))

解决了这个问题。难以排除故障的是,在我尝试返回 IQueryable 之前,上面的映射代码一直在工作。

【讨论】:

    【解决方案2】:

    使用QueryableExtensions 时,您必须明确进行一些类型转换,例如int?int。这可能是“参数类型不匹配”异常的来源。

    如果您有许多需要类型转换的属性(例如,如果您有许多其他属性,您发现您正在执行c.MyVariable ?? 0),您可以改为定义转换规则,而不必明确说明每个属性。

    通常,要在 Automapper 中进行类型转换,您会使用 ConvertUsing,但在使用 QueryableExtensions 时,您需要改用 ProjectUsing

    您可以使用以下行,它将处理从 int?int 的所有映射,而无需显式指定每个属性的映射:

    cfg.CreateMap<int?, int>().ProjectUsing(src => src.HasValue ? src.Value : 0);
    

    【讨论】:

      【解决方案3】:

      在映射结束时与.ForAllOtherMembers(opt =&gt; opt.Ignore()); 链接对我有用。这应该是方法链中的最后一个方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-31
        • 2011-06-26
        • 2017-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多