如何使用Entity Framework查询Mysql数据库 并实现多表联查

news2024/11/28 8:34:55

简介

🍀通过依赖注入的方式,使用ORM工具Entity Framework查询Mysql数据库中的数据,并实现多表联查

假设我们有一个user用户表,其中occupationid对应的就是下面职业表中的id

 职业表Occupations

 

 现在我们需要查出用户的职业是什么,在MySQL中我们可以通过LEFT JOIN实现多表查询。如下sql语句。

SELECT name,opname FROM Users 
LEFT JOIN Occupations ON Users.opid = Occupations.id

 如果想要在EFCore中完成这种需求应该怎么操作呢。

安装nuget包

分别安装如下两个nuget包,具体版本要参考自己实际的MySQL版本

NuGet\Install-Package Microsoft.Extensions.Hosting -Version 8.0.0
NuGet\Install-Package Pomelo.EntityFrameworkCore.MySql -Version 7.0.0

创建上下文类

首先创建一个继承自 DbContext 的上下文类,使用DbSet 属性来表示数据库中的表

public class MyContext : DbContext
{
    public MyContext(DbContextOptions<MyContext> options)
        : base(options)
    {
    }

    public virtual DbSet<User> Users { get; set; } = null!;
    
    public virtual DbSet<Occupation> Occupations { get; set; } = null!;
}

然后分别创建我们数据库两张表的实体类,它们通过导航属性 occupationid 相互关联

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    
    public int occupationid { get; set; }
    
    public Occupation Occupation { get; set; }
}

public class Occupation
{
    public int Id { get; set; }
    
    public string opname { get; set; }
}

依赖注入

打开我们的program类,创建一个主机构建器,通过AddDbContextPool注册 MyContext 类型到服务容器中。

然后通过AddHostedService 方法添加一个后台服务,该服务将在应用程序启动时运行,这里我添加的是selectUser服务,也就是项目启动的时候会执行它,接下来我们去写selectUser服务

class Program
{
    public static void Main(string[] args)
    {
         // 创建一个主机构建器,用于配置应用程序的启动和依赖注入。
        HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);

        // 配置服务,这里添加了数据库上下文池,用于管理数据库连接。
        builder.Services.AddDbContextPool<MyContext>(
            p =>
            {
                p.UseMySql("server=127.0.0.1;uid=root;pwd=password;database=mydb", new MySqlServerVersion("5.7"),
                    opt => opt.UseQuerySplittingBehavior(QuerySplittingBehavior.SplitQuery));
                p.LogTo(Console.WriteLine, LogLevel.Information);
                p.EnableSensitiveDataLogging(true);
            }, 150);

        // 添加宿主服务,我们稍后创建selectUser服务
        builder.Services.AddHostedService<selectUser>();

         // 构建宿主。
        using IHost host = builder.Build();

        // 运行宿主,启动应用程序。
        host.Run();
    }
}

定义一个名为selectUser的类,继承自BackgroundService ,在构造函数中添加参数MyContext ,项目运行时会通过依赖注入给当前类提供一个MyContext上下文,这样,selectUser 类就可以使用这个 DbContext 实例来访问数据库。

使用 _myContext.Users 来访问数据库中的 Users 表。Include(p => p.Occupation) 表示在查询用户时,还要包括关联的 Occupation 实体

public class selectUser : BackgroundService
{
    private readonly MyContext _myContext;

    public selectUser(MyContext myContext)
    {
        _myContext = myContext;
    }
    

    protected override async Task<int> ExecuteAsync(CancellationToken stoppingToken)
    {
        var find = _myContext.Users
            .Include(p => p.Occupation)
            .ToList();
        foreach (var user in find)
        {
            Console.WriteLine(user.Name);
        }

        return 0;
    }
}

这样在程序执行的时候,我们就可以通过多表联查获得用户的职业

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1392739.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

隐秘而精湛:反射物镜用于激光烧蚀质谱系统

激光烧蚀电感耦合等离子体质谱技术 激光烧蚀电感耦合等离子体质谱 &#xff08;LA-ICP-MS&#xff09; 因其灵敏度和概念简单性而被认为是固体材料成分分析最通用的方法之一。自 1985 年 A. Gray 进行首次可行性研究以来&#xff0c;在仪器进步和智能调谐和校准策略概念的推动…

【IDEA相关问题】全局搜索快捷键ctrl+shift+f与win10输入法简繁体切换冲突

解决方案如下&#xff1a; 1. 打开Windows设置&#xff0c;选择【时间和语言】&#xff0c;接着选择【语言】 2. 选择中文&#xff08;简体&#xff0c;中国&#xff09;——【选项】 3. 找到【微软拼音】——【选项】 4. 选择【按键】进入下一步设置界面 5. 在按键设置里即可…

Github 2024-01-16 Python开源项目日报 Top10

根据Github Trendings的统计&#xff0c;今日(2024-01-16统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目10HTML项目1 精心策划的Python资源列表 创建周期&#xff1a;3490 天开发语言&#xff1a;Python…

【LabVIEW FPGA入门】FPGA中的数学运算

数值控件选板上的大部分数学函数都支持整数或定点数据类型&#xff0c;但是需要请注意&#xff0c;避免使用乘法、除法、倒数、平方根等函数&#xff0c;此类函数比较占用FPGA资源&#xff0c;且如果使用的是定点数据或单精度浮点数据仅适用于FPGA终端。 1.整数运算 支持的数…

性能测试jmeter

参考up主 啥时当叫兽的个人空间-啥时当叫兽个人主页-哔哩哔哩视频 IMBA_RAILGUN的个人空间-IMBA_RAILGUN个人主页-哔哩哔哩视频 大丫头胖的个人空间-大丫头胖个人主页-哔哩哔哩视频 选的这些怎么添加 在一个列表里面 方法调用${__time(YMD)} 两个下划线&#xff0c;后跟函数…

Cpp多线程(一)

一、基本概念 1、程序是一段静态代码&#xff1b;进程是正在运行的程序&#xff1b;线程则是程序内部的执行路径。 上面这张图就解释了线程和多线程的意义。 2、若一个程序在同一时间执行多个线程&#xff0c;便是支持多线程的。一个进程中的多个线程共享相同的内存单元/内存…

MS2660:L1 频段卫星导航射频前端低噪声放大器芯片

MS2660 是一款具有高增益、低噪声系数的低噪声放 大器&#xff08;LNA&#xff09;芯片&#xff0c;支持 L1 频段多模式全球卫星定位&#xff0c;可 以应用于 GPS、北斗二代、伽利略、Glonass 等 GNSS 导航 接收机中。芯片采用先进工艺制造&#xff0c;封装采用 2 mm 2 mm …

【latex】参考文献排版前移,在最前面引用\usepackage{url}

【LaTeX】参考文献排版前移&#xff0c;在最前面引用\usepackage{url} 写在最前面完整解决步骤请教申申latex编译报错解决方案 写在最前面 参考文献从21开始排版前移了 解决方案&#xff1a;在最前面加一行 \usepackage{url}完整解决步骤 请教申申 申申yyds&#xff01;&am…

HarmonyOS—构建第一个ArkTS应用(Stage模型)

创建ArkTS工程 构建第一个页面 若首次打开DevEco Studio&#xff0c;请点击Create Project创建工程。如果已经打开了一个工程&#xff0c;请在菜单栏选择File > New > Create Project来创建一个新工程。选择Application应用开发&#xff0c;选择模板“Empty Ability”&am…

推荐几款IDEA插件,助你玩转Mybatis开发

在软件开发的征程中&#xff0c;MyBatis 框架一直是 Java 开发者中的首选&#xff0c;其简洁的 SQL 映射和强大的灵活性使其成为持久层框架的瑰宝。然而&#xff0c;在我们开发过程中&#xff0c;很多人都曾面对过一个相对繁琐的问题&#xff1a;如何高效而准确地将数据库表映射…

element的el-select组件数据过多使用分页

一、代码实现 1. 单个下拉框 <template><div><!-- 为了启用远程搜索&#xff0c;需要将filterable和remote设置为true&#xff0c;同时传入一个remote-method。remote-method为一个Function&#xff0c;它会在输入值发生变化时调用&#xff0c;参数为当前输入…

Ceph应用管理

目录 资源池 Pool 管理 创建 CephFS 文件系统 MDS 接口 服务端操作 客户端操作 创建 Ceph 块存储系统 RBD 接口 创建 Ceph 对象存储系统 RGW 接口 OSD 故障模拟与恢复 资源池 Pool 管理 我们如何向 Ceph 中存储数据呢&#xff1f;首先我们需要在 Ceph 中定义一个 Pool…

代码随想录算法训练营29期|day 21 任务以及具体安排

530.二叉搜索树的最小绝对差 力扣题目链接(opens new window) 给你一棵所有节点为非负值的二叉搜索树&#xff0c;请你计算树中任意两节点的差的绝对值的最小值。 示例&#xff1a; 提示&#xff1a;树中至少有 2 个节点。 class Solution {TreeNode pre;// 记录上一个遍历的…

C++ 数论相关题目(约数)

1、试除法求约数 主要还是可以成对的求约数进行优化&#xff0c;不然会超时。 时间复杂度根号n #include <iostream> #include <vector> #include <algorithm>using namespace std;int n;vector<int> solve(int a) {vector<int> res;for(int i…

力扣714. 买卖股票的最佳时机含手续费(java 动态规划)

Problem: 714. 买卖股票的最佳时机含手续费 文章目录 题目描述思路解题方法复杂度Code 题目描述 思路 1.构建多阶段决策模型&#xff1a;n天对应n个阶段&#xff0c;每个阶段决策&#xff1a;买股票、卖股票、不操作&#xff1b;买股票只有当前不持有股票才行&#xff0c;卖股票…

IntelliJ IDEA 拉取gitlab项目

一、准备好Gitlab服务器及项目 http://192.168.31.104/root/com.saas.swaggerdemogit 二、打开 IntelliJ IDEA安装插件 打开GitLab上的项目&#xff0c;输入项目地址 http://192.168.31.104/root/com.saas.swaggerdemogit 弹出输入登录用户名密码&#xff0c;完成。 操作Comm…

【数据结构】二叉树-堆(top-k问题,堆排序,时间复杂度)

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;《数据结构》https://blog.csdn.net/qinjh_/category_12536791.html?spm1001.2014.3001.5482 ​​ 目录 堆排序 第一种 ​编辑 第二种 …

Linux开发工具:yum、vim、gcc/g++、makefile

文章目录 一. Linux软件包管理器-yum使用1. Linux 安装软件的方式2. yum 三板斧yum listyum installyum remove 二. Linux编辑器-vim使用1. vim 的基本概念2. vim 的基本操作3. vim 的命令模式命令集4. vim 底行模式命令集 三. Linux编译器-gcc/g使用1. 快速使用2. 程序翻译过程…

【Linux】文件系统与软硬连接

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;【LeetCode】winter vacation training 目录 &#x1f449;&#x1f3fb; 磁盘HDD的物理存储结构磁盘的逻辑抽象…

element-ui Vue 封装组件按钮工具栏,使用slot插槽

封装常用按钮工具栏,方便其它页面调用 缺点:工具栏下面div会显示工具栏下面,下面需要使用margin-top:40px(小学生一个没整明白)希望大神能帮解决 运行效果 组件代码 tt-btnBar.vue <template><div><div class"btnbarP"><div class"btnbar…