EFCore中利用原生sql进行联表/多表查询

EFCore中利用原生sql进行联表/多表查询
EFCore的多表查询可以使用join,include这些进行查询,但是写起来比较复杂,它们一般适用于单表查询(个人觉得),对于多表查询,我更喜欢使用原生SQL这种方式。具体方式如下(这里以2张表关联为例):
首先,创建两张数据库中对应的实体类:

[Table("Sys_User")]
    public class Sys_User
    {
        /// 
        /// 自增主键
        /// 
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }
        
        /// 
        /// 姓名
        /// 
        public string Name { get; set; }

        /// 
        /// 密码
        /// 
        public string Password { get; set; }
        /// 
        /// 角色Id
        /// 
        public int RoleId { get; set; }
        /// 
        /// 角色
        /// 
        public string Role { get; set; }
        /// 
        /// 生日
        /// 
        public DateTime Birthday  { get; set; }
    }
/// 
    /// 学生表
    /// 
    [Table("Student")]
    public class Student
    {

        /// 
        /// Id
        /// 
        [Key]
        public int Id { get; set; }
        /// 
        /// 用户Id
        /// 
        public int UserId { get; set; }
        /// 
        /// 年级
        /// 
        public int Grade { get; set; }
        /// 
        /// 班级名称
        /// 
        public string ClassName { get; set; }
    }
然后创建个你想从这两张表中查询的字段所组成的一个实体类(这个实体类不需要存在于数据库中),比如我想要Sys_User表的Name字段和Student表中的ClassName字段,则需添加类(类名随便取,但要注意,除这两个以外一定要添加一个主键字段,如Id):
	public class Result
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string ClassName { get; set; }
    }

然后再上下文类中添加如下三个Dbset

 public DbSet<Sys_User> Sys_Users { get; set; }
 public DbSet<Student> Students { get; set; }

 public DbSet<Result>  Results { get; set; }

此时,写个接口测试下:

		/// 
        /// EF联表/多表查询
        /// 
        /// 1`   。
        [HttpGet]
        public async Task<IActionResult> TestQuery()
        {
            var sql = "select a.Id,a.Name,b.ClassName from Sys_User a left join Student b on a.Id = b.UserId";
            var result = await _dbContext.Results.FromSqlRaw(sql).ToListAsync();
            return Ok(result);
        }
    经测试,成功;(这样是不是挺简单的呢!如有不对,欢迎指正!!!)

你可能感兴趣的:(EFCore)