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\n如果您不\xe2\x80\x99t 使用
\nMap,只是ProjectTo,您应该使用CreateProjection而不是CreateMap。这样,您\xe2\x80\x99 将仅使用 所支持的 API 子集,ProjectTo并且启动速度应该更快。
\n\n\n
CreateProjection明确禁用Map.CreateMap允许两者。
因此,如果您只需要通过 ORM(如实体框架)进行实体 -> DTO 映射,则ProjectTo使用CreateProjection,否则使用CreateMap。
细节
\n正如文档中所写,如果您正在使用 ORM,则IQueryable可以使用ProjectToAutoMapper+ORM 对来生成正确的 SQL 语句,而不是将整个实体提取到内存中(如果您没有以一对一的方式映射,则这可以对性能产生积极影响)并将其映射到客户端:
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}\nRun Code Online (Sandbox Code Playgroud)\n\n\n将
\n.ProjectTo<OrderLineDTO>()告诉 AutoMapper\xe2\x80\x99s 映射引擎向 发出一个 select 子句,这IQueryable将通知实体框架它只需要查询 Item 表的 Name 列,就像您手动将其投影IQueryable到OrderLineDTOwith aSelect子句一样。
由于它的性质,ProjectTo它实际上可以映射/执行的操作受到更多限制(并非所有内容都可以转换为 SQL)。
阅读更多:
\nCreateProjection和CreateMap\n\n\n\n
CreateProjection明确禁用Map.CreateMap允许两者。
\n\n如果您不\xe2\x80\x99t 使用
\nMap,只是ProjectTo,您应该使用CreateProjection而不是CreateMap。这样,您\xe2\x80\x99 将仅使用 所支持的 API 子集,ProjectTo并且启动速度应该更快。
\n\n您也不能为相同的映射/成员单独配置
\nMap和ProjectTo。
| 归档时间: |
|
| 查看次数: |
1578 次 |
| 最近记录: |