AutoMapper官方文档(六)【投影】

本文介绍如何使用AutoMapper进行对象模型之间的投影及自定义成员映射,特别是当目标对象结构与源对象不完全匹配时的具体实现方法。

投影

投影将源换为目标,而不是将对象模型展平。 没有额外的配置,AutoMapper需要一个平坦的目标地来匹配源类型的命名结构。 如果要将源值映射到与源结构不完全匹配的目标,则必须指定自定义成员映射定义。 例如,我们可能想要转向这个源代码结构:

public class CalendarEvent
{
    public DateTime Date { get; set; }
    public string Title { get; set; }
}

进入更适合网页输入表单的东西:

public class CalendarEventForm
{
    public DateTime EventDate { get; set; }
    public int EventHour { get; set; }
    public int EventMinute { get; set; }
    public string Title { get; set; }
}

由于目标属性的名称不完全匹配源属性 (CalendarEvent.Date 需要是CalendarEventForm.EventDate),因此我们需要在我们的类型映射配置中指定自定义成员映射:

// 模型
var calendarEvent = new CalendarEvent
{
    Date = new DateTime(2008, 12, 15, 20, 30, 0),
    Title = "Company Holiday Party"
};

// 配置AutoMapper
Mapper.Initialize(cfg =>
  cfg.CreateMap<CalendarEvent, CalendarEventForm>()
    .ForMember(dest => dest.EventDate, opt => opt.MapFrom(src => src.Date.Date))
    .ForMember(dest => dest.EventHour, opt => opt.MapFrom(src => src.Date.Hour))
    .ForMember(dest => dest.EventMinute, opt => opt.MapFrom(src => src.Date.Minute)));

// 执行映射
CalendarEventForm form = Mapper.Map<CalendarEvent, CalendarEventForm>(calendarEvent);

form.EventDate.ShouldEqual(new DateTime(2008, 12, 15));
form.EventHour.ShouldEqual(20);
form.EventMinute.ShouldEqual(30);
form.Title.ShouldEqual("Company Holiday Party");

每个自定义成员配置都使用一个动作委托来配置每个成员。 在上面的例子中,我们使用MapFrom选项来执行自定义的源到目标成员映射。 MapFrom方法将lambda表达式作为参数,然后在映射期间对其进行评估。 MapFrom表达式可以是任何Func<TSource, object> lambda表达式。

/* *代码由框架生成,任何更改都可能导致被代码生成器覆盖 *如果数据库字段发生变化,请在代码生器重新生成此Model */ using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Linq; using System.Text; using System.Threading.Tasks; using AutoMapper.Configuration.Annotations; using SqlSugar; using VOL.Entity.SystemModels; namespace VOL.Entity.DomainModels { [SugarTable("Category_Tree_Node")] [Entity(TableCnName = "分类编码节点表",TableName = "category_tree_node")] public partial class category_tree_node:BaseEntity { /// <summary> ///主键ID,唯一标识每个节点 /// </summary> [SugarColumn(IsPrimaryKey = true)] [Key] [Display(Name ="主键ID,唯一标识每个节点")] [MaxLength(50)] [Column(TypeName="nvarchar(50)")] [Editable(true)] [Required(AllowEmptyStrings=false)] public string id { get; set; } /// <summary> ///父节点ID,根节点为NULL /// </summary> [Display(Name ="父节点ID,根节点为NULL")] [MaxLength(50)] [Column(TypeName="nvarchar(50)")] [Editable(true)] public string parent_id { get; set; } /// <summary> ///分类编码,用于标识节点的分类信息 /// </summary> [Display(Name ="分类编码,用于标识节点的分类信息")] [MaxLength(100)] [Column(TypeName="nvarchar(100)")] [Editable(true)] [Required(AllowEmptyStrings=false)] public string category_code { get; set; } /// <summary> ///创建人,记录创建该节点的用户 /// </summary> [Display(Name ="创建人,记录创建该节点的用户")] [MaxLength(100)] [Column(TypeName="nvarchar(100)")] [Editable(true)] [Required(AllowEmptyStrings=false)] public string creator { get; set; } /// <summary> ///创建时间,记录节点的创建时间 /// </summary> [Display(Name ="创建时间,记录节点的创建时间")] [Column(TypeName="datetime")] [Editable(true)] [Required(AllowEmptyStrings=false)] public DateTime create_time { get; set; } /// <summary> ///修改人,记录最后一次修改该节点的用户 /// </summary> [Display(Name ="修改人,记录最后一次修改该节点的用户")] [MaxLength(100)] [Column(TypeName="nvarchar(100)")] [Editable(true)] public string modifier { get; set; } /// <summary> ///修改时间,记录最后一次修改的时间 /// </summary> [Display(Name ="修改时间,记录最后一次修改的时间")] [Column(TypeName="datetime")] [Editable(true)] public DateTime? modify_time { get; set; } /// <summary> ///删除标识,0表示未删除,1表示已删除 /// </summary> [Display(Name ="删除标识,0表示未删除,1表示已删除")] [Column(TypeName="short")] [Editable(true)] [Required(AllowEmptyStrings=false)] public short is_deleted { get; set; } /// <summary> ///分类名称 /// </summary> [Display(Name ="分类名称")] [MaxLength(100)] [Column(TypeName="nvarchar(100)")] [Required(AllowEmptyStrings=false)] public string category_name { get; set; } /// <summary> ///启用状态 /// </summary> [Display(Name ="启用状态")] [Column(TypeName="short")] [Required(AllowEmptyStrings=false)] public short is_status { get; set; } /// <summary> ///版本版次规则 /// </summary> [Display(Name ="版本版次规则")] [MaxLength(2000)] [Column(TypeName="nvarchar(2000)")] public string version_rule { get; set; } /// <summary> ///文件等级 /// </summary> [Display(Name ="文件等级")] [MaxLength(10)] [Column(TypeName="nvarchar(10)")] public string file_level { get; set; } /// <summary> ///文件密级 /// </summary> [Display(Name ="文件密级")] [MaxLength(10)] [Column(TypeName="nvarchar(10)")] public string file_secret { get; set; } /// <summary> ///文档类型标识 /// </summary> [Display(Name ="文档类型标识")] [MaxLength(100)] [Column(TypeName="nvarchar(100)")] public string type_identifier { get; set; } /// <summary> ///编码规则 /// </summary> [Display(Name ="编码规则")] [MaxLength(100)] [Column(TypeName="nvarchar(100)")] public string code_rule { get; set; } /// <summary> ///文档安全等级 /// </summary> [Display(Name ="文档安全等级")] [MaxLength(10)] [Column(TypeName="nvarchar(10)")] public string document_security_level { get; set; } /// <summary> ///叶子节点 /// </summary> [Display(Name ="叶子节点")] [Column(TypeName="int")] [Required(AllowEmptyStrings=false)] public int leaf { get; set; } /// <summary> ///文档编码标识 /// </summary> [Display(Name = "文档编码标识")] [MaxLength(100)] [Column(TypeName = "nvarchar(100)")] public string filecode_identifier { get; set; } /// <summary> ///文档项目组 /// </summary> [Display(Name = "文档项目组,以','区分")] [MaxLength(100)] [Column(TypeName = "nvarchar(256)")] public string team_group { get; set; } /// <summary> ///外文档项目组 /// </summary> [Display(Name = "文档项目组,以','区分")] [MaxLength(100)] [Column(TypeName = "nvarchar(256)")] public string externalteam_group { get; set; } /// <summary> ///共享事业部 /// </summary> [Display(Name = "文档项目组,以','区分")] [MaxLength(100)] [Column(TypeName = "nvarchar(256)")] public string shared_business_unit { get; set; } [Display(Name = "是否发送mes")] [Column(TypeName = "short")] [Editable(true)] [Required(AllowEmptyStrings = false)] public short issendmes { get; set; } [Display(Name = "是否发送dam")] [Column(TypeName = "short")] [Editable(true)] [Required(AllowEmptyStrings = false)] public short issenddam { get; set; } /// <summary> ///所属业务场景 /// </summary> [Display(Name = "所属业务场景")] [MaxLength(50)] [Column(TypeName = "nvarchar(50)")] public string business_scenario { get; set; } /// <summary> ///所属阶段 /// </summary> [Display(Name = "所属阶段")] [MaxLength(50)] [Column(TypeName = "nvarchar(50)")] public string belong_stage { get; set; } /// <summary> ///存储策略 /// </summary> [Display(Name = "存储策略")] [MaxLength(50)] [Column(TypeName = "nvarchar(50)")] public string storage_strategy { get; set; } /// <summary> ///dam文档类型 /// </summary> [Display(Name = "dam文档类型")] [MaxLength(50)] [Column(TypeName = "nvarchar(50)")] public string dam_file_type { get; set; } /// <summary> ///共享范围 /// </summary> [Display(Name = "共享范围")] [MaxLength(200)] [Column(TypeName = "nvarchar(200)")] public string sharing_scope { get; set; } /// <summary> ///模版范围 /// </summary> [Display(Name = "模版范围")] [MaxLength(200)] [Column(TypeName = "nvarchar(200)")] public string template_range { get; set; } /// <summary> ///项目编码 /// </summary> [Display(Name = "项目编码")] [MaxLength(200)] [SugarColumn(IsIgnore = true)] public string projectCode { get; set; } /// <summary> ///项目来源 /// </summary> [Display(Name = "项目来源")] [MaxLength(200)] [SugarColumn(IsIgnore = true)] public string source { get; set; } [MaxLength(200)] [SugarColumn(IsIgnore = true)] public string userCode { get; set; } [MaxLength(200)] [SugarColumn(IsIgnore = true)] public string factory { get; set; } } }这是我的实体,按理来说 var resultModel = await _cateRespository .FindAsIQueryable(x => x.category_code == result.file_type_code && x.is_deleted == 0) .LeftJoin<category_tree_node>((current, parent) => current.parent_id == parent.id) .Where((current, parent) => parent != null && parent.is_deleted == 0 && parent.category_name == "工艺文件") .Select((current, parent) => new { current, parent }) .FirstAsync();应该没问题吧
最新发布
11-26
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值