当前位置: 首页 > article >正文

AutoMapper的使用

toMapper.Extensions.ExpressionMapping 是 AutoMapper 的一个扩展库,旨在优化使用 LINQ 查询的场景,尤其是在从数据库或远程 API 获取数据时。它提供了将 AutoMapper 映射表达式直接转换为 LINQ 查询表达式的功能,进而使得你可以避免手动编写映射代码,并在数据库或 API 层面直接进行高效的查询映射。

1. AutoMapper 和 AutoMapper.Extensions.ExpressionMapping 的引入

首先,确保你安装了 AutoMapper 和 AutoMapper.Extensions.ExpressionMapping NuGet 包。

安装 AutoMapper
dotnet add package AutoMapper
安装 AutoMapper.Extensions.ExpressionMapping
dotnet add package AutoMapper.Extensions.ExpressionMapping

2. 使用 AutoMapper.Extensions.ExpressionMapping

AutoMapper.Extensions.ExpressionMapping 允许你在 LINQ 查询中直接使用 AutoMapper 映射,避免将查询结果加载到内存中后再进行映射。这样可以提高查询效率,尤其是在处理大数据集时。

基本步骤:
  1. 配置 AutoMapper:首先,你需要配置 AutoMapper 映射。
using AutoMapper;

public class SourceClass
{
    public string Name { get; set; }
    public int Age { get; set; }
}

public class DestinationClass
{
    public string Name { get; set; }
    public int Age { get; set; }
}

public class MappingProfile : Profile
{
    public MappingProfile()
    {
        CreateMap<SourceClass, DestinationClass>();
    }
}
  1. 在项目中使用 ExpressionMapping: 为了将 AutoMapper 映射表达式集成到 LINQ 查询中,你需要在查询中使用 ProjectTo 方法。ProjectTo 方法会将 AutoMapper 映射转化为查询表达式,从而使映射发生在数据库层。
using AutoMapper;
using AutoMapper.Extensions.ExpressionMapping;
using Microsoft.EntityFrameworkCore;
using System.Linq;

public class Example
{
    private readonly IMapper _mapper;
    private readonly DbContext _context;

    public Example(IMapper mapper, DbContext context)
    {
        _mapper = mapper;
        _context = context;
    }

    public async Task GetMappedData()
    {
        // 使用 ProjectTo 直接在查询中映射
        var result = await _context.Set<SourceClass>()
                                    .ProjectTo<DestinationClass>(_mapper.ConfigurationProvider)
                                    .ToListAsync();
                                    
        foreach (var item in result)
        {
            Console.WriteLine($"Name: {item.Name}, Age: {item.Age}");
        }
    }
}

3. 工作原理

  • ProjectToProjectTo 会根据 IMapper 的配置将源数据投影(映射)到目标类型。这个过程发生在数据库查询阶段(即 SQL 生成之前),而不是查询后,这意味着只有映射所需的字段会被加载,避免了不必要的性能开销。

  • 查询到数据库:当你在 EF Core 查询中使用 ProjectTo 时,AutoMapper 会将映射表达式转换为 LINQ 查询,并将其传递给数据库引擎,从而生成 SQL 查询并仅返回所需的列。

4. 示例:将 AutoMapper 与 Entity Framework Core 结合使用

假设我们有以下 SourceClassDestinationClass,并且我们正在使用 Entity Framework Core 来查询数据库。我们希望直接在查询时进行映射。

public class SourceClass
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
}

public class DestinationClass
{
    public string Name { get; set; }
    public int Age { get; set; }
}

在配置了 AutoMapper 后,你可以通过 ProjectTo 在数据库查询中直接映射对象。

public class MyService
{
    private readonly IMapper _mapper;
    private readonly MyDbContext _context;

    public MyService(IMapper mapper, MyDbContext context)
    {
        _mapper = mapper;
        _context = context;
    }

    public async Task<List<DestinationClass>> GetMappedData()
    {
        var query = _context.SourceClasses
                            .ProjectTo<DestinationClass>(_mapper.ConfigurationProvider);

        var result = await query.ToListAsync();

        return result;
    }
}

在上述代码中:

  • ProjectTo<DestinationClass>(_mapper.ConfigurationProvider) 将 SourceClass 映射为 DestinationClass,并在 SQL 查询中仅选择所需的字段。
  • 注意_mapper.ConfigurationProvider 是 AutoMapper 的配置提供程序,它会传递给 ProjectTo,使得映射表达式能够与数据库查询兼容。

5. AutoMapper.Extensions.ExpressionMapping 的优缺点

优点
  • 提高性能:通过在数据库查询阶段进行映射,避免了加载不必要的数据,从而提升性能。
  • 简化代码:减少了手动映射的代码,映射过程自动发生。
  • 无缝集成:非常适合与 Entity Framework 或其他 ORM 框架一起使用。
缺点
  • 复杂查询时的限制:有些复杂的映射可能无法直接转换为 SQL,因此需要手动映射。
  • 数据库功能依赖:自动映射的转换依赖于数据库支持的功能,某些转换可能不被数据库原生支持,从而导致性能问题。

总结

AutoMapper.Extensions.ExpressionMapping 为 AutoMapper 提供了一个非常实用的扩展,允许你在查询数据库时直接进行映射,避免了额外的数据加载和后续的转换。它尤其适用于与 Entity Framework 等 ORM 工具结合使用,能够在查询时直接映射数据模型,优化性能和代码可读性。如果你的项目涉及到数据访问并且使用了 AutoMapper,ExpressionMapping 是一个非常有用的工具。


http://www.kler.cn/a/519426.html

相关文章:

  • hadoop==docker desktop搭建hadoop
  • 学习std::is_base_of笔记
  • 数据结构基础之《(15)—排序算法小结》
  • StarRocks BE源码编译、CLion高亮跳转方法
  • 面向程序员的Lean 4教程(2) - 数组和列表
  • Mysql索引(学习自用)
  • stm8s单片机(三)时钟系统与时钟切换
  • 【工具】CountUp.js
  • 国产编辑器EverEdit - 目录树
  • SSH代理實用指南
  • 【Matlab高端绘图SCI绘图模板】第003期 绘制面积填充图
  • 【AI非常道】二零二五年一月,AI非常道
  • 数据结构——概念与时间空间复杂度
  • 【Java】面试中遇到的两个排序
  • 策略模式 - 策略模式的使用
  • 【Leetcode刷题记录】18.四数之和
  • HTML5和CSS3拔高
  • mysql数据库启动出现Plugin ‘FEEDBACK‘ is disabled.问题解决记录
  • 08.OSPF 特殊区域及其他特性
  • 嵌入式音视频开发——视频篇(一)
  • 【10】如何辨别IOS AP镜像
  • Ubuntu安装GitLab
  • 解锁FPGA的故障免疫密码
  • 【软件设计师中级】-笔记缩减版本-程序设计语言基础
  • 小马模拟器-第三方全街机游戏模拟器
  • MinIO的安装与使用