AutoMapper:CreateMap 和 CreateProjection 有什么区别?

Luk*_*164 3 c# mapping automapper entity-framework-core blazor-server-side

我正在寻找有关 automapper 中的 CreateMap/CreateProjection 和 ProjectTo/MapTo 之间关系的差异的解释。我刚刚开始使用这个库,我很难理解何时使用什么。我部分理解 ProjectTo 与 LINQ 有一些关系并且可以用于整个集合?我希望在 Blazor 服务器端项目中使用此库。

当我使用 EF Core 时,我也在研究这两个库:

但由于我是图书馆的新手,我认为在继续之前先从基础开始是个好主意。

Gur*_*ron 10

长话短说

\n
\n

如果您不\xe2\x80\x99t 使用Map,只是ProjectTo,您应该使用CreateProjection而不是CreateMap。这样,您\xe2\x80\x99 将仅使用 所支持的 API 子集,ProjectTo并且启动速度应该更快。

\n
\n
\n

CreateProjection明确禁用Map. CreateMap允许两者。

\n
\n

因此,如果您只需要通过 ORM(如实体框架)进行实体 -> DTO 映射,则ProjectTo使用CreateProjection,否则使用CreateMap

\n

细节

\n

正如文档中所写,如果您正在使用 ORM,则IQueryable可以使用ProjectToAutoMapper+ORM 对来生成正确的 SQL 语句,而不是将整个实体提取到内存中(如果您没有以一对一的方式映射,则这可以对性能产生积极影响)并将其映射到客户端:

\n
var configuration = new MapperConfiguration(cfg =>\n    cfg.CreateProjection<OrderLine, OrderLineDTO>()\n    .ForMember(dto => dto.Item, conf => conf.MapFrom(ol => ol.Item.Name)));\n\npublic List<OrderLineDTO> GetLinesForOrder(int orderId)\n{\n  using (var context = new orderEntities())\n  {\n    return context.OrderLines.Where(ol => ol.OrderId == orderId)\n             .ProjectTo<OrderLineDTO>(configuration).ToList();\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n
\n

.ProjectTo<OrderLineDTO>()告诉 AutoMapper\xe2\x80\x99s 映射引擎向 发出一个 select 子句,这IQueryable将通知实体框架它只需要查询 Item 表的 Name 列,就像您手动将其投影IQueryableOrderLineDTOwith aSelect子句一样。

\n
\n

由于它的性质,ProjectTo它实际上可以映射/执行的操作受到更多限制(并非所有内容都可以转换为 SQL)。

\n

阅读更多:

\n
    \n
  1. IQueryable 和 IEnumerable 之间有什么区别?
  2. \n
  3. 定义CreateProjectionCreateMap\n
    \n

    CreateProjection明确禁用Map. CreateMap允许两者。

    \n
    \n
  4. \n
  5. 11.0 升级指南:\n
    \n

    如果您不\xe2\x80\x99t 使用Map,只是ProjectTo,您应该使用CreateProjection而不是CreateMap。这样,您\xe2\x80\x99 将仅使用 所支持的 API 子集,ProjectTo并且启动速度应该更快。

    \n
    \n
  6. \n
  7. 12.0升级指南\n
    \n

    您也不能为相同的映射/成员单独配置MapProjectTo

    \n
    \n
  8. \n
  9. 未调用 AutoMapper ConvertUsing
  10. \n
\n