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

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

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

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

        /// <summary>
        /// Id
        /// </summary>
        [Key]
        public int Id { get; set; }
        /// <summary>
        /// 用户Id
        /// </summary>
        public int UserId { get; set; }
        /// <summary>
        /// 年级
        /// </summary>
        public int Grade { get; set; }
        /// <summary>
        /// 班级名称
        /// </summary>
        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; }

此时,写个接口测试下:

		/// <summary>
        /// EF联表/多表查询
        /// </summary>
        /// <returns></returns>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);
        }
    经测试,成功;(这样是不是挺简单的呢!如有不对,欢迎指正!!!)
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值