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);
}
经测试,成功;(这样是不是挺简单的呢!如有不对,欢迎指正!!!)