当前位置: 首页 > news >正文

EFCore pgsql Join 查询

  1. 安装包
   > Microsoft.EntityFrameworkCore              6.0.35   6.0.35> Microsoft.EntityFrameworkCore.Tools        6.0.35   6.0.35> Npgsql.EntityFrameworkCore.PostgreSQL      6.0.29   6.0.29
  1. 定义实体等

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;namespace EFCoreJoinQuery
{public class EFCoreHelperDbContext:DbContext{public EFCoreHelperDbContext(DbContextOptions<EFCoreHelperDbContext> options):base(options){}public DbSet<Student> Students { get; set; }public DbSet<School> Schools { get; set;}public DbSet<StudentHobby> StudentHobbys { get;set; }protected override void OnModelCreating(ModelBuilder modelBuilder){modelBuilder.HasDefaultSchema("ellis"); //因为这里我是将表生成到这个schemabase.OnModelCreating(modelBuilder);modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly);  }}public class School{public int SchoolId { get; set; }public string Name { get; set; }}public class SchoolConfig : IEntityTypeConfiguration<School>{public void Configure(EntityTypeBuilder<School> builder){builder.ToTable("school");builder.HasKey(x => x.SchoolId);builder.Property(x => x.Name).IsRequired().HasColumnName("name");builder.Property(x=>x.SchoolId).HasColumnName("school_id").ValueGeneratedOnAdd();}}public class Student{public int StudentId { get; set;}public string Name { get; set; }public int SchoolId { get; set; }}public class StudentConfig : IEntityTypeConfiguration<Student>{public void Configure(EntityTypeBuilder<Student> builder){builder.ToTable("student");builder.HasKey(x => x.StudentId);builder.Property(x => x.Name).IsRequired().HasColumnName("name");builder.Property(x => x.SchoolId).HasColumnName("school_id");builder.Property(x => x.StudentId).HasColumnName("student_id").ValueGeneratedOnAdd();}}public class StudentHobby{public int HobbyId { get; set; }public string Name { get; set; }public int StudentId { get; set; }}public class StudentHobbyConfig : IEntityTypeConfiguration<StudentHobby>{public void Configure(EntityTypeBuilder<StudentHobby> builder){builder.ToTable("student_hobby");builder.HasKey(x => x.HobbyId);builder.Property(x=>x.Name).IsRequired().HasColumnName("name");builder.Property(x => x.StudentId).HasColumnName("student_id");builder.Property(x => x.HobbyId).HasColumnName("hobby_id").ValueGeneratedOnAdd();}}
}
  1. DI

这里需要说明的是需要配置MigrationsHistoryTable,因为我这里是将表迁移到ellis这个schema,所以迁移的历史表也需要创建到这个schema中

builder.Services.AddDbContext<EFCoreHelperDbContext>((sp, options) =>
{options.UseNpgsql("Host=192.168.214.133;Port=32222;Database=postgresdb;Username=postgresadmin;Password=admin123;SearchPath=ellis;",x=>x.MigrationsHistoryTable(HistoryRepository.DefaultTableName,"ellis")).LogTo(Console.WriteLine, new[] { DbLoggerCategory.Database.Command.Name }, LogLevel.Information).EnableSensitiveDataLogging();
});
  1. 迁移
add-migration ellis
update-databse ellis
  1. controller使用
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;namespace EFCoreJoinQuery.Controllers
{[Route("api/[controller]/[action]")][ApiController]public class JoinController : ControllerBase{private readonly EFCoreHelperDbContext _eFCoreHelperDbContext;public JoinController(EFCoreHelperDbContext eFCoreHelperDbContext){_eFCoreHelperDbContext = eFCoreHelperDbContext;}//两张表[HttpGet]public async  Task<IActionResult> Query2Join(){// 单列Joinvar value = from s in _eFCoreHelperDbContext.Schoolsjoin st in _eFCoreHelperDbContext.Studentson s.SchoolId equals st.SchoolIdselect new { SchoolName = s.Name, StudentName = st.Name};//多列Join//on        new { m1.field1, m1.field2 }//      equals new { m2.field1, m2.field2 }return Ok(value);}//三张表[HttpGet]public async Task<IActionResult> Query3Join(){var value = from s in _eFCoreHelperDbContext.Schoolsjoin st in _eFCoreHelperDbContext.Studentson s.SchoolId equals st.SchoolIdjoin h in _eFCoreHelperDbContext.StudentHobbyson st.StudentId equals  h.StudentId//因为hobby是多个,这里需要分组一次group h by new { schollName = s.Name,studentName = st.Name } into groupedselect new{SchoolName = grouped.Key.schollName,StudentName = grouped.Key.studentName,HobbyNames = string.Join(", ", grouped.Select(g => g.Name))};return Ok(value);}}
}

https://www.tektutorialshub.com/entity-framework-core/join-query-in-ef-core/


http://www.mrgr.cn/news/57799.html

相关文章:

  • MacOS RocketMQ安装
  • 075_基于springboot的万里学院摄影社团管理系统
  • 基于SpringBoot+Vue+uniapp微信小程序的婚庆摄影小程序的详细设计和实现(源码+lw+部署文档+讲解等)
  • Git - 如何删除 push 过一次的文件链路追踪?
  • Python快速入门教程
  • C 语言入门教程
  • 502 错误码通常出现在什么场景?
  • c语言指针详解2
  • Java开发者必备!0元学习Maven环境最新版超详细配置教程
  • 安全见闻(9)——开阔眼界,不做井底之蛙
  • 排序算法在最坏情况下的性能差异:深入分析
  • dcef文件下载--程序节排坑二
  • 【Java】SpringBoot实现MySQL数据库的增删查改
  • 【ROS2】在启动文件launch中,配置节点崩溃后自动重启
  • 编程中的注意事项
  • 打印一张A4纸多少钱?
  • 精品推荐 | StarPure石蜡包埋样本DNA提取试剂盒
  • Linux:sh脚本
  • 【读书笔记·VLSI电路设计方法解密】问题21:为什么降低芯片的功耗如此重要
  • vuetify页面布局
  • Spring事务详解——面试必看!
  • 常见的磁盘挂载方式
  • 软考中级网络工程师,快背,都是精华知识点!
  • 基于vue框架的的高校设备信息管理系统的设计与实现tx6d7(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。
  • k8s 部署步骤整理(containerd)
  • C# 创建型设计模式之----单例模式