Web开发:ORM框架之使用Freesql的导航属性
一、什么时候用导航属性
看数据库表的对应关系,一对多的时候用比较好,不用多写一个联表实体,而且查询高效

二、为实体配置导航属性
1.给关系是一的父表实体加上:
[FreeSql.DataAnnotations.Navigate(nameof(子表.子表关联字段))]public List<子表> xxx { get; set; } = new List<子表>();
2.给关系是n的子表实体加上:
[FreeSql.DataAnnotations.Navigate(nameof(子表关联字段))]public 父表 yyy { get; set; }
3.Demo例子:(一个省份对应多个城市)
/// <summary>
/// 1
/// </summary>
[Table("Province")]
public class Province
{[FreeSql.DataAnnotations.Column(IsPrimary = true, IsIdentity = true, Name = "Id")]public int Id { get; set; }[Column("ProvinceCode")]public int? ProvinceCode { get; set; }[FreeSql.DataAnnotations.Navigate(nameof(City.ProvinceId))]public List<City> citys { get; set; } = new List<City>();
}/// <summary>
/// n
/// </summary>
[Table("City")]
public class City
{[FreeSql.DataAnnotations.Column(IsPrimary = true, IsIdentity = true, Name = "Id")]public int Id { get; set; }[Column("CityCode")]public int? CityCode { get; set; }[Column("ProvinceId")]public int ProvinceId { get; set; }[Column("CityGroup")]public int? CityGroup { get; set; }[FreeSql.DataAnnotations.Navigate(nameof(ProvinceId))]public Province province { get; set; }
}
三、怎么用导航属性
原理:左外连接
总结:使用关键字Include(找父表)、IncludeMany(找子表)
// 一对多导航属性关联查询
// 01 无条件查询
// 导航属性带出其父表(可序列化)
var list1 = MSfsql.Select<City>().Include(x => x.province).ToList();// 导航属性带出其子表(不可序列化,因为子表含有父表字段,会一直引用下去)
var list2 = MSfsql.Select<Province>().IncludeMany(x => x.citys).ToList();// 02 有条件查询
// 【子表 -> 父表】
var query1 = MSfsql.Select<City>().Where(x => (x.province.Id < 20) && (x.Id == 1 || x.Id == 198)) //先对本表(子表)筛选,条件可含子表 父表.Include(x=>x.province) // 选择带出查询结果对应的那个父表.ToList();// 【父表->子表】
var query2 = MSfsql.Select<Province>().Where(x => x.Id < 20 && x.citys.Any(x=> x.Id ==1 || x.Id==198 )) //先对本表(父表)筛选,条件可含子表 父表.IncludeMany(x => x.citys) // 选择带出查询结果对应的多个子表.ToList();var query3 = MSfsql.Select<Province>().Where(x => x.Id < 20 && x.citys.Any(x => x.Id == 1 || x.Id == 198)) //先对本表(父表)筛选,条件可含子表 父表.IncludeMany(x => x.citys, then => then.Where(x=> x.CityGroup == 1)) // 选择带出子表,并且要求子表具备一定条件.ToList();
四、一对多免导航属性配置的写法
1.实体
仅给关系是一的父表实体加上List<子表>字段即可
/// <summary>
/// 1
/// </summary>
[Table("Province")]
public class Province
{[FreeSql.DataAnnotations.Column(IsPrimary = true, IsIdentity = true, Name = "Id")]public int Id { get; set; }[Column("ProvinceCode")]public int? ProvinceCode { get; set; }//[FreeSql.DataAnnotations.Navigate(nameof(City.ProvinceId))]public List<City> citys { get; set; } = new List<City>();
}/// <summary>
/// n
/// </summary>
[Table("City")]
public class City
{[FreeSql.DataAnnotations.Column(IsPrimary = true, IsIdentity = true, Name = "Id")]public int Id { get; set; }[Column("CityCode")]public int? CityCode { get; set; }[Column("ProvinceId")]public int ProvinceId { get; set; }[Column("CityGroup")]public int? CityGroup { get; set; }// [FreeSql.DataAnnotations.Navigate(nameof(ProvinceId))]// public Province province { get; set; }
}
2.查询方法
原理:先查满足条件的父表,提取出这些父表ID,再通过提取的父表ID查子表,freesql内部代码会通过IncludeMany里面的表达式树关联父表和子表
var query4 = fsql.Select<Province>().Where(x=>x.Id > 10) //此处写父表 or 子表的查询条件,筛选出父表.IncludeMany(x => x.citys.Where(y => x.Id == y.ProvinceId)) //此处写关联条件,带出子表.ToList();//本质是查两次,freesql内部有代码优化机制
相关文章:
Web开发:ORM框架之使用Freesql的导航属性
一、什么时候用导航属性 看数据库表的对应关系,一对多的时候用比较好,不用多写一个联表实体,而且查询高效 二、为实体配置导航属性 1.给关系是一的父表实体加上: [FreeSql.DataAnnotations.Navigate(nameof(子表.子表关联字段))]…...
【docker】namespace底层机制
Linux 的 Namespace 机制是实现容器化(如 Docker、LXC 等)的核心技术之一,它通过隔离系统资源(如进程、网络、文件系统等)为进程提供独立的运行环境。其底层机制涉及内核数据结构、系统调用和进程管理。以下是其核心实…...
【每天认识一个漏洞】url重定向
🌝博客主页:菜鸟小羊 💖专栏:Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 常见应用场景 主要是业务逻辑中需要进行跳转的地方。比如登录处、注册处、访问用户信息、订单信息、加入购物车、分享、收…...
端口映射/内网穿透方式及问题解决:warning: remote port forwarding failed for listen port
文章目录 需求:A机器是内网机器,B机器是公网服务器,想要从公网,访问A机器的端口方式:端口映射,内网穿透,使用ssh打洞端口:遇到问题:命令执行成功,但是端口转发…...
Polardb开发者大会
这是第二次参加这个大会 还有不少老朋友 好多年没有这种经历了–大会讲的我不是很懂 10几年前参会,那时候自己不懂。后来就慢慢懂了。这些年参会都虽然还在不断学习,但是没觉得自己差距很大了。 这次出来很不一样,一堆新的技能,这…...
从二维随机变量到多维随机变量
二维随机变量 设 X X X和 Y Y Y是定义在同一样本空间 Ω \varOmega Ω上的两个随机变量,称由它们组成的向量 ( X , Y ) (X, Y) (X,Y)为二维随机变量,亦称为二维随机向量,其中称 X X X和 Y Y Y是二维随机变量的分量。 采用多个随机变量去描述…...
Vulnhub靶场 Kioptrix: Level 1.3 (#4) 练习
目录 0x00 环境准备0x01 主机信息收集0x02 站点信息收集0x03 漏洞查找与利用0x04 总结 0x00 环境准备 下载:https://download.vulnhub.com/kioptrix/Kioptrix4_vmware.rar 解压后得到的是vmdk文件。在vm中新建虚拟机,稍后安装操作系统,系统选…...
权重生成图像
简介 前面提到的许多生成模型都有保存了生成器的权重,本章主要介绍如何使用训练好的权重文件通过生成器生成图像。 但是如何使用权重生成图像呢? 一、参数配置 ima_size 为图像尺寸,这个需要跟你模型训练的时候resize的时候一样。 latent_dim为噪声维度,一般的设置都是…...
实时时钟(RTC)/日历芯片PCF8563的I2C读写驱动(2):功能介绍
0 参考资料 PCF8563数据手册(第 11 版——2015 年 10 月 26 日).pdf 1 功能介绍 1.1 实时时钟(RTC)/日历 (1)PCF8563支持实时时钟(RTC),提供时、分、秒信息。对应寄存器…...
猿大师播放器:HTML内嵌VLC播放RTSP视频流,无需转码,300ms级延迟,碾压服务器转码方案
在智慧城市、工业安全、应急指挥等关键领域,实时视频监控已成为守护生命与财产的核心防线。然而,行业普遍面临三大矛盾: 实时性要求与高延迟矛盾:火灾蔓延速度达1米/秒,化工泄漏扩散仅需数秒,传统方…...
牛客刷题自留-深度学习
1、当在卷积神经网络中加入池化层(pooling layer)时,平移变换的不变性会被保留,是吗? 正常答案: C A 不知道 B 看情况 C 是 D 否 平移变换不变性的概念 平移变换不变性指的是当输入图像发生小范围的平移时,模型的输出结果不会发…...
AI 时代下,操作系统如何进化与重构?
AI 时代下,操作系统如何进化与重构? AI时代服务器操作系统技术挑战2024 龙蜥操作系统大会最关注的是哪些议题分享与讨论?对于操作系统未来的发展趋势,有哪些观察和建议 2024 龙蜥操作系统大会(OpenAnolis Conference&a…...
Hadoop最新版本hadoop-3.4.1搭建伪分布式集群以及相关报错解决
一:概述 Hadoop 是一个开源的分布式计算框架,广泛应用于大数据处理。伪分布式集群是 Hadoop 的一种部署模式,它可以在单台机器上模拟集群环境,适合初学者进行学习和实验。本文将详细介绍如何在单台机器上搭建 Hadoop 3.4.1 的伪分…...
Android SDK与NDK的区别
Android SDK(Software Development Kit)与NDK(Native Development Kit)在Android应用开发中各自扮演着重要角色,它们之间存在显著的区别。以下是Android SDK与NDK的主要区别: 一、定义与用途 Android SDK…...
【保姆级视频教程(二)】YOLOv12训练数据集构建:标签格式转换-划分-YAML 配置 避坑指南 | 小白也能轻松玩转目标检测!
【2025全站首发】YOLOv12训练数据集构建:标签格式转换-划分-YAML 配置 避坑指南 | 小白也能轻松玩转目标检测! 文章目录 1. 数据集准备1.1 标签格式转换1.2 数据集划分1.3 yaml配置文件创建 2. 训练验证 1. 数据集准备 示例数据集下载链接:P…...
smolagents学习笔记系列(八)Examples - Master you knowledge base with agentic RAG
这篇文章锁定官网教程中 Examples 章节中的 Master you knowledge base with agentic RAG 文章,主要介绍了如何将 agent 和 RAG 结合使用。 官网链接:https://huggingface.co/docs/smolagents/v1.9.2/en/examples/rag; Agentic RAG 在之前的…...
满血版DeepSeek R1使用体验
硅基流动的满血版DeepSeek,通过CheeryStudio可以轻松访问,告别DeepSeek官网服务器繁忙,https://cloud.siliconflow.cn/i/ewlWR6A9 即可注册 https://cloud.siliconflow.cn/i/ewlWR6A9https://cloud.siliconflow.cn/i/ewlWR6A9 一、硅基流动平…...
Java类中的this操作
在Java中,`this` 是一个关键字,用于引用当前对象的实例。它通常在类的方法或构造器中使用,主要有以下几种用途: 1. 区分成员变量和局部变量 当成员变量与局部变量同名时,使用 `this` 可以明确引用当前对象的成员变量。 public class Person { private String name; …...
LeetCode刷题---双指针---532
数组中的 k-diff 数对 532. 数组中的 k-diff 数对 - 力扣(LeetCode) 题目 给你一个整数数组 nums 和一个整数 k,请你在数组中找出 不同的 k-diff 数对,并返回不同的 k-diff 数对 的数目。 k-diff 数对定义为一个整数对 (nums[…...
cpp单调栈模板
题目如下 如果利用暴力解法,时间复杂度是O(n^2) 只能过60%的数据 AC解法: 利用单调栈的算法,单调栈里存的是之前遍历过的元素的下标,如果满足while的条件就将栈顶元素记录,然后将其弹出&#x…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...
破解路内监管盲区:免布线低位视频桩重塑停车管理新标准
城市路内停车管理常因行道树遮挡、高位设备盲区等问题,导致车牌识别率低、逃费率高,传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法,正成为破局关键。该设备安装于车位侧方0.5-0.7米高度,直接规避树枝遮…...
0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化
是不是受够了安装了oracle database之后sqlplus的简陋,无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话,配置.bahs_profile后也能解决上下翻页这些,但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可,…...
在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例
目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码:冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...
6.9-QT模拟计算器
源码: 头文件: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMouseEvent>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);…...
