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
可以使用ProjectTo
AutoMapper+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}\n
Run Code Online (Sandbox Code Playgroud)\n\n\n将
\n.ProjectTo<OrderLineDTO>()
告诉 AutoMapper\xe2\x80\x99s 映射引擎向 发出一个 select 子句,这IQueryable
将通知实体框架它只需要查询 Item 表的 Name 列,就像您手动将其投影IQueryable
到OrderLineDTO
with 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 次 |
最近记录: |