龟叔啊 2022-02-21 10:54 采纳率: 50%
浏览 96
已结题

AutoMapper 联合查询映射问题

问题遇到的现象和发生背景

项目中经常遇到列表分页数据展示的业务,比如学生信息列表,它包括的学生姓名、所属班级、学籍号、联系方式、家庭地址等信息,一般我们会设计两张表,学生信息表和班级表,学生所属班级通过学生信息表保存的班级ID关联,列表显示时通过班级ID显示所属班级的名称。表结构(简化)和界面显示如下:
学生表结构:

img


班级表结构:

img


列表显示界面:

img

分页列表模型(当然这里应该是个集合,我只截图出集合中的对象模型):

public class StudentGridViewModel
    {
        /// <summary>
        /// ID
        /// </summary>
        public string ID { get; set; }

        /// <summary>
        /// 姓名
        /// </summary>
        public string UserName { get; set; }

        /// <summary>
        /// 账户;与学籍辅号一致。
        /// </summary>
        public string UserCode { get; set; }
         ....

        #region 扩展字段

        public string ClassName { get; set; }


        #endregion
    }

在没有接触AutoMapper前,我一般时通过SQL语句进行联合查询出列表的模型字段:

select T.*,C.ClassName from EIC_Student as T
join EIC_Class as C on C.ID=T.ClassID

最后模型装载数据后返回给页面使用,在初步了解AutoMapper后,我改为各自查询数据并返回表数据库表模型,也就是分别查询学生信息表和班级信息表:
学生数据库表模型:

/// <summary>
    /// 学生信息
    /// </summary>
    [Serializable]
    public class EIC_Student
    {
        /// <summary>
        /// ID
        /// </summary>
        public string ID { get; set; }

        /// <summary>
        /// 姓名
        /// </summary>
        public string UserName { get; set; }
          ...
    }
}

班级信息表数据库模型:

 public partial class EIC_Class

    {
        public EIC_Class()
        { }

        #region Model

        private string _id;
        private string _classname;
         ...
        /// <summary>
        ///
        /// </summary>
        public string ID
        {
            set { _id = value; }
            get { return _id; }
        }

        /// <summary>
        /// 班级名称
        /// </summary>
        public string ClassName
        {
            set { _classname = value; }
            get { return _classname; }
        }
        ....
    }

然后将学生数据库信息表模型(EIC_Student)映射为StudentGridViewModel,目前到达这一步没有问题,最后我想将班级信息表数据库模型(EIC_Class)的ClassName映射给StudentGridViewModel的ClassName,但失败了,AutoMapper默认会将两个模型相同字段名称都进行映射,这造成了原先EIC_Student映射给StudentGridViewModel的值全部为空了,只保留了ClassName和ID有值(班级信息表和StudentGridViewModel之间ID和ClassName相同,且其实这个ID值是EIC_Class的ID值也是不对)。
我不知道如何处理这种,无耐之下我暂时的处理方式是循环StudentGridViewModel的每一项(其实是个列表多条数据需要循环),赋值ClassName:

img

业务逻辑层的代码:

img

我不知道AutoMapper的使用是否是这样处理以上场景的(联合查询),个人初涉该组件,认为按照AutoMapper的约定所有数据库返回都应该为数据库最原始的模型,然后通过映射为客户端要使用的模型,不应该有联合查询语句。(不知道理解是否有误)!

问题
  1. 是否所有数据库返回的都应该是数据库表实体,不应该使用联合查询,再使用AutoMapper进行映射?
  2. 如果问题1成立,那么如何只映射ClassName?如果问题1不对请赐教!
  • 写回答

3条回答 默认 最新

报告相同问题?

问题事件

  • 系统已结题 4月4日
  • 赞助了问题酬金10元 3月31日
  • 修改了问题 3月28日
  • 赞助了问题酬金10元 3月27日
  • 展开全部

悬赏问题

  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题