02020409 EF Core基础09-一对一、多对多、EF Core基于关系的复杂查询

news/2025/10/6 11:16:49/文章来源:https://www.cnblogs.com/python-web/p/19127418

02020409 EF Core基础09-一对一、多对多、EF Core基于关系的复杂查询

1. 一对一(视频3-20)

1.1 一对一关系
采购申请单 ↔ 采购订单
订单 ↔ 快递单
  • 一对一:对方都是对方的唯一。
    • 一个订单单对应一个快递单,一个快递单也对应一个订单。
1.2 新建一对一的实体类
class Order // 订单
{public long Id { get; set; }public string Name { get; set; }public string Address { get; set; }public Delivery Delivery { get; set;} // Delivery类型的属性,对应哪个快递单。
}
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
class Delivery // 快递单
{public long Id { get; set; }public string CompanyName { get; set; }public String Number { get; set; }public Order Order { get; set; } // Order类型的属性,对应哪个订单。public long OrderId { get; set; }
}说明:
1. 必须显式的在其中一个实体类中声明一个外键属性。显式声明的外键属性既可以在订单中声明,也可以在快递单中声明,注意只需要建一个就行。
2. 在前面讲到的一对多是否声明外键属性不强制要求显式声明,因为一对多情况下:多的一端是一定有一个外键属性来对应一的一端,会自动生成外键而不需要显式声明。
1.3 一对一关系配置
1、builder.HasOne<Delivery>(o => o.Delivery).WithOne(d => d.Order).HasForeignKey<Delivery>(d=>d.OrderId);

2. 一对一项目示例

2.1 创建项目
  • 创建OneToOne控制台项目
// OneToOne.csproj直接添加依赖包
<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><OutputType>Exe</OutputType><TargetFramework>net5.0</TargetFramework></PropertyGroup><ItemGroup><PackageReference Include="microsoft.entityframeworkcore.sqlserver" Version="5.0.4" /><PackageReference Include="microsoft.entityframeworkcore.tools" Version="5.0.4"><PrivateAssets>all</PrivateAssets><IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets></PackageReference></ItemGroup></Project>
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
// Order.cs
namespace OneToOne
{class Order{public long Id { get; set; }public string Name { get; set; }public string Address { get; set; }public Delivery Delivery { get; set; } // Delivery类型的属性,对应哪个快递单。}
}
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
// OrderConfig.cs
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;namespace OneToOne
{class OrderConfig : IEntityTypeConfiguration<Order>{public void Configure(EntityTypeBuilder<Order> builder){builder.ToTable("T_Orders");builder.HasOne<Delivery>(o => o.Delivery).WithOne(d => d.Order).HasForeignKey<Delivery>(o => o.OrderId);}}
}
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
// Delivery.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace OneToOne
{class Delivery{public long Id { get; set; }public string CompanyName { get; set; }public String Number { get; set; }public Order Order { get; set; } // Order类型的属性,对应哪个订单。public long OrderId { get; set; }}
}
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
// DeliveryConfig.cs
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace OneToOne
{class DeliveryConfig : IEntityTypeConfiguration<Delivery>{public void Configure(EntityTypeBuilder<Delivery> builder){builder.ToTable("T_Deliveries");}}
}
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
// MyDbContext.cs
using Microsoft.EntityFrameworkCore;
using System;namespace OneToOne{class MyDbContext : DbContext{public DbSet<Order> Orders { get; set; }public DbSet<Delivery> Deliveries { get; set; }protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder){string connStr = "Server=.;Database=CoreDataDB;Trusted_Connection=True;MultipleActiveResultSets=true";optionsBuilder.UseSqlServer(connStr);// optionsBuilder.LogTo(Console.WriteLine);}protected override void OnModelCreating(ModelBuilder modelBuilder){base.OnModelCreating(modelBuilder);modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly);}}
}
3.2 迁移数据库
PM> add-migration init
Build started...
Build succeeded.
To undo this action, use Remove-Migration.
PM> update-database
Build started...
Build succeeded.
Applying migration '20250923121957_init'.
Done.
PM> 
  • 通过SSMS查看表
Typora-Logo
T_Deliveries表和外键关系

T_Orders表
3.3 插入数据
// 插入数据形式1:通过关联的形式存储数据,顺杆爬。
using Microsoft.EntityFrameworkCore;
using System;
using System.Linq;namespace OneToOne
{class Program{static void Main(string[] args){using(MyDbContext ctx = new MyDbContext()){Order od01 = new Order { Name = "书" };Delivery dl01 = new Delivery { CompanyName = "科科快递", Number = "keke001", Order = od01}; // @1ctx.Add(dl01); // 此时存od01是不可以的,因为od01没有关联两个对象。而dl01中Order = od01关联了两个对象。ctx.SaveChanges(); }Console.WriteLine("数据插入成功!!!");}}
}
控制台输出:
数据插入成功!!!说明:在@1处,Order = od01使得两个对象产生关系,保存时会自动给外键赋值。我们不需要显式的外键赋值。// 查看数据库
T_Orders表
1	书	NULLT_Deliveries表
Id	CompanyName	Number	OrderId
1	科科快递	keke001	1
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
// 插入数据形式2:不考虑顺杆爬的问题,直接将所有的数据都存起来。
using Microsoft.EntityFrameworkCore;
using System;
using System.Linq;namespace OneToOne
{class Program{static void Main(string[] args){using(MyDbContext ctx = new MyDbContext()){Order od01 = new Order { Name = "书" };Delivery dl01 = new Delivery { CompanyName = "科科快递", Number = "keke001", Order = od01};// 直接存储,不考虑顺杆爬的问题。ctx.Orders.Add(od01); // 直接存,不考虑顺杆爬ctx.Deliveries.Add(dl01); // 直接存,不考虑顺杆爬ctx.SaveChanges(); }Console.WriteLine("数据插入成功!!!");}}
}// 查看数据库
T_Orders表
1	书	NULLT_Deliveries表
Id	CompanyName	Number	OrderId
1	科科快递	keke001	1
3.4 查询数据
using System;
using System.Linq;namespace OneToOne
{class Program{static void Main(string[] args){using (MyDbContext ctx = new MyDbContext()){IQueryable<Order> orders = ctx.Orders.Where(o => o.Delivery.CompanyName == "科科快递"); // 查询科科快递对应的所有订单foreach (var item in orders){Console.WriteLine(item.Name);}}Console.WriteLine("数据查询成功!!!");}}
}控制台输出:
书
数据查询成功!!!

3. 多对多(视频3-21)

3.1 多对多关系
1、多对多:老师—学生。
2、EF Core 5.0开始,才正式支持多对多
3、需要中间表,举例数据。中间表由EF Core自动生成,我们只需要配置一下中间表的名字即可。说明:一个老师可以有多个学生,一个学生可以有多个老师。
3.2 新建多对多的实体类
class Student
{public long Id { get; set; }public string Name { get; set; }public List<Teacher> Teachers { get; set; } = new List<Teacher>();
}
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
class Teacher
{public long Id { get; set; }public string Name { get; set; }public List<Student> Students { get; set; } = new List<Student>();
}
3.3 多对多关系配置
builder.HasMany<Teacher>(s => s.Teachers).WithMany(t=>t.Students).UsingEntity(j=>j.ToTable("T_Students_Teachers"));说明:UsingEntity()配置中间表,参数为中间表的名称。

4. 多对多项目示例

4.1 创建项目
  • 创建ManyToMany控制台项目
// ManyToMany.csproj
<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><OutputType>Exe</OutputType><TargetFramework>net5.0</TargetFramework></PropertyGroup><ItemGroup><PackageReference Include="microsoft.entityframeworkcore.sqlserver" Version="5.0.4" /><PackageReference Include="microsoft.entityframeworkcore.tools" Version="5.0.4"><PrivateAssets>all</PrivateAssets><IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets></PackageReference></ItemGroup></Project>
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
// Student.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ManyToMany
{class Student{public long Id { get; set; }public string Name { get; set; }public List<Teacher> Teachers { get; set; } = new List<Teacher>();}
}
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
// StudentConfig.cs
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ManyToMany
{class StudentConfig : IEntityTypeConfiguration<Student>{public void Configure(EntityTypeBuilder<Student> builder){builder.ToTable("T_Students");builder.HasMany<Teacher>(s => s.Teachers).WithMany(t => t.Students).UsingEntity(j => j.ToTable("T_Students_Teachers"));}}
}
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
// Teacher.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ManyToMany
{class Teacher{public long Id { get; set; }public string Name { get; set; }public List<Student> Students { get; set; } = new List<Student>();}
}
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
// TeacherConfig.cs
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ManyToMany
{class TeacherConfig : IEntityTypeConfiguration<Teacher>{public void Configure(EntityTypeBuilder<Teacher> builder){builder.ToTable("T_Teachers");}}
}
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
// MyDbContext.cs
using Microsoft.EntityFrameworkCore;
using System;namespace ManyToMany{class MyDbContext : DbContext{public DbSet<Student> Students { get; set; }public DbSet<Teacher> Teachers { get; set; }protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder){string connStr = "Server=.;Database=CoreDataDB;Trusted_Connection=True;MultipleActiveResultSets=true";optionsBuilder.UseSqlServer(connStr);// optionsBuilder.LogTo(Console.WriteLine);}protected override void OnModelCreating(ModelBuilder modelBuilder){base.OnModelCreating(modelBuilder);modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly);}}
}
4.2 迁移数据库
PM> add-migration init
Build started...
Build succeeded.
To undo this action, use Remove-Migration.
PM> update-database
Build started...
Build succeeded.
Applying migration '20250923134033_init'.
Done.
  • 查看数据表
图片链接丢失
4.3 插入数据
// Program.cs
using Microsoft.EntityFrameworkCore;
using System;
using System.Linq;namespace ManyToMany
{class Program{static void Main(string[] args){using(MyDbContext ctx = new MyDbContext()){Student st01 = new Student { Name = "张三" };Student st02 = new Student { Name = "李四" };Student st03 = new Student { Name = "王五" };Teacher th01 = new Teacher { Name = "Tom" };Teacher th02 = new Teacher { Name = "Jerry" };Teacher th03 = new Teacher { Name = "Zack" };st01.Teachers.Add(th01);st01.Teachers.Add(th02);st02.Teachers.Add(th02);st02.Teachers.Add(th03);st03.Teachers.Add(th01);st03.Teachers.Add(th02);st03.Teachers.Add(th03);// 所有的学生和老师都插入,避免漏项。虽然麻烦,但是事少。不推荐顺杆爬ctx.Teachers.Add(th01);ctx.Teachers.Add(th02);ctx.Teachers.Add(th03);ctx.Students.Add(st01);ctx.Students.Add(st02);ctx.Students.Add(st03);ctx.SaveChanges();}Console.WriteLine("数据插入成功!!!");}}
}控制台输出:
数据插入成功!!!// T_Students表
Id	Name
1	张三
2	李四
3	王五// T_Teachers表
Id	Name
1	Tom
2	Jerry
3	Zack// T_Students_Teachers表
StudentsId	TeachersId
1	1
3	1
1	2
2	2
3	2
2	3
3	3
4.4 查询数据
// Program.cs
using Microsoft.EntityFrameworkCore;
using System;
using System.Linq;namespace ManyToMany
{class Program{static void Main(string[] args){using(MyDbContext ctx = new MyDbContext()){var teachers = ctx.Teachers.Include(t => t.Students);foreach (var th in teachers){Console.WriteLine(th.Name);foreach (var st in th.Students){Console.WriteLine("\t" + st.Name);}}}Console.WriteLine("数据查询成功!!!");}}
}控制台输出:
Tom张三王五
Jerry张三李四王五
Zack李四王五
数据查询成功!!!

5. EF Core基于关系的复杂查询(视频3-22)

5.1 一对多的复杂查询
  • 基于02020407章2.1小结项目继续演示
// 通过SSMS在T_Articles表中添加如下数据
Id	Title	Message
1	杨中科入选中科院	大新闻
2	微软发布.NET 10.0	中新闻
3	微软发射微星	小新闻
4	中国发射小行星探测器	劲爆新闻// 通过SSMS在T_Comments表中添加如下数据
Id	TheArticleId	Message
1	1	太牛了
2	2	微软不过如此
3	3	微软真牛
4	4	OMG
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
// 查询评论中含有“微软”的所有的文章
形式1:ctx.Articles.Where(a=>a.Comments.Any(c=>c.Message.Contains("微软")));
形式2:ctx.Comments.Where(c => c.Message.Contains("微软")).Select(c => c.Article).Distinct();查看两种形式生成的SQL语句。
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
// 查询形式1:Program.cs
using System;
using System.Linq;namespace OneToMany
{class Program{static void Main(string[] args){using (MyDbContext ctx = new MyDbContext()){// 从Article入手var items = ctx.Articles.Where(a => a.Comments.Any(c => c.Message.Contains("微软"))); // Article中Comments属性中Message属性包含“微软”的文章。foreach (var item in items){Console.WriteLine(item.Title);}}Console.ReadLine();}}
}控制台输出:
微软发布.NET 10.0
微软发射微星// 查看SQL语句
SELECT [t].[Id], [t].[Message], [t].[Title]FROM [T_Articles] AS [t]WHERE EXISTS (SELECT 1FROM [T_Comments] AS [t0]WHERE ([t].[Id] = [t0].[TheArticleId]) AND ([t0].[Message] LIKE N'%微软%'))
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
// 查询形式2:Program.cs
using System;
using System.Linq;namespace OneToMany
{class Program{static void Main(string[] args){using (MyDbContext ctx = new MyDbContext()){IQueryable<Article> items = ctx.Comments.Where(c => c.Message.Contains("微软")).Select(c => c.TheArticle); // 评论的Messages属性包含微软,然后Select(投影)到Article上。foreach (var item in items){Console.WriteLine(item.Title);}}Console.ReadLine();}}
}控制台输出:
微软发布.NET 10.0
微软发射微星// 查看SQL语句SELECT [t0].[Id], [t0].[Message], [t0].[Title]FROM [T_Comments] AS [t]INNER JOIN [T_Articles] AS [t0] ON [t].[TheArticleId] = [t0].[Id]WHERE [t].[Message] LIKE N'%微软%'
5.2 一对多的复杂查询:排重
  • 基于本节5.1继续演示
// 通过SSMS在T_Articles表中添加如下数据
Id	Title	Message
1	杨中科入选中科院	大新闻
2	微软发布.NET 10.0	中新闻
3	微软发射微星	小新闻
4	中国发射小行星探测器	劲爆新闻// 通过SSMS在T_Comments表中添加如下数据
Id	TheArticleId	Message
1	1	科科太牛了
2	2	微软不过如此
3	3	微软真牛
4	3	微软真水
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
// Program.cs
using System;
using System.Linq;namespace OneToMany
{class Program{static void Main(string[] args){using (MyDbContext ctx = new MyDbContext()){IQueryable<Article> items = ctx.Comments.Where(c => c.Message.Contains("微软")).Select(c => c.TheArticle); // 评论的Messages属性包含微软,然后Select(投影)到Article上。foreach (var item in items){Console.WriteLine(item.Title);}}Console.ReadLine();}}
}控制台输出:
微软发布.NET 10.0
微软发射微星
微软发射微星// 查看SQL语句SELECT [t0].[Id], [t0].[Message], [t0].[Title]FROM [T_Comments] AS [t]INNER JOIN [T_Articles] AS [t0] ON [t].[TheArticleId] = [t0].[Id]WHERE [t].[Message] LIKE N'%微软%'说明:此时微软发射微星重复了2次。
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
// Program.cs
using System;
using System.Linq;namespace OneToMany
{class Program{static void Main(string[] args){using (MyDbContext ctx = new MyDbContext()){IQueryable<Article> items = ctx.Comments.Where(c => c.Message.Contains("微软")).Select(c => c.TheArticle).Distinct(); // Distinct方法排重。foreach (var item in items){Console.WriteLine(item.Title);}}Console.ReadLine();}}
}控制台输出:
微软发布.NET 10.0
微软发射微星// 查看SQL语句
SELECT DISTINCT [t0].[Id], [t0].[Message], [t0].[Title]FROM [T_Comments] AS [t]INNER JOIN [T_Articles] AS [t0] ON [t].[TheArticleId] = [t0].[Id]WHERE [t].[Message] LIKE N'%微软%'说明:排重之后,相同的文章只输出一次。
5.3 一对多两种复杂查询方式对比
  • 在5.1和5.2小节中,两种查询在应对不同的需求时效率是不同的,按需选择。
    • 如果用5.1中有性能瓶颈,那么可以尝试用5.2中的形式,反之亦然。

结尾

书籍:ASP.NET Core技术内幕与项目实战

视频:https://www.bilibili.com/video/BV1pK41137He

著:杨中科

ISBN:978-7-115-58657-5

版次:第1版

发行:人民邮电出版社

※敬请购买正版书籍,侵删请联系85863947@qq.com※

※本文章为看书或查阅资料而总结的笔记,仅供参考,如有错误请留言指正,谢谢!※

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

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

相关文章

02020503 EF Core高级03-分页查询、IQuerable底层的实现形式、DataReader、DataTable、EF Core中的异步方法

02020503 EF Core高级03-分页查询、IQuerable底层的实现形式、DataReader、DataTable、EF Core中的异步方法 1. EF Core分页查询(视频3-27) 1.1 分页查询的实现 1、Skip(3).Take(8) 最好显式指定排序规则,Skip表示跳…

02020502 EF Core高级02-IQuerable会延迟执行、分部和动态构建IQuerable、IQuerable的复用

02020502 EF Core高级02-IQuerable会延迟执行、分部和动态构建IQuerable、IQuerable的复用 1. IQuerable会延迟执行(视频3-25) 1、测试一下:只查询,但是不遍历IQueryable,查看是否有执行SQL语句。 2、在查询之后、…

在 PyCharm 中,环境:bert_env , 执行 import wandb 报错。但是,在CMD窗口,环境:bert_env , 执行 import wandb 正常。

同一个wandb包,使用相同的conda虚拟环境,在pycharm中导入失败,在command窗口中导入成功。 同一个ssl包,使用相同的conda虚拟环境,在pycharm中导入失败,在command窗口中导入成功。在 PyCharm 中,环境:bert_env …

设计网站排行北京有哪些网站建设公司

[html] 当html中使用map标签时,area中coords值如何精确定位呢&#xff1f; 在 area 标签上支持的属性有 shape、coords、href、alt、target、type、download、hreflang、media、rel&#xff1b; coords 值如何精确定位圆形&#xff0c;在绘制一个圆形时&#xff0c;其 shapeci…

libopenssl1_0_0-1.0.2p-3.49.1.x86_64安装教程(RPM包手动安装步骤+依赖解决附安装包下载)

libopenssl1_0_0-1.0.2p-3.49.1.x86_64安装教程(RPM包手动安装步骤+依赖解决附安装包下载)​ ​第一步:先检查下系统环境​ 这包是 ​x86_64 架构的(也就是常见的 64 位 Linux 系统),你得确认自己的系统是 64 位…

Linux_T(Sticky Bit)粘滞位详解 - 详解

Linux_T(Sticky Bit)粘滞位详解 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "M…

和顺网站建设电商推广和网络推广的策略

桥梁模式 定义 桥梁模式&#xff08;Bridge Pattern&#xff09;也叫做桥接模式。 将抽象和显示解耦&#xff0c;使得两者可以独立地变化。 优缺点、应用场景 优点 抽象和实现的解耦。 这是桥梁模式的主要特点&#xff0c;它完全是为了解决继承的缺点而提出的设计模式。优…

P2831 [NOIP 2016 提高组] 愤怒的小鸟 题解

传送门 洛谷 题目大意 每关给你最多18只小猪(后文皆为18只),问你最少用几条过原点抛物线全部干掉。 注意这里 \(m\) 其实没用,因为你要是会算最优解了为啥还需要部分分啊? 思路 \(n\leq18\) ,不是暴搜就是状压。…

t型布局网站怎么做移动网站开发公司

无限网络应用越来越广泛&#xff0c;由此应运而生了许多可以蹭网的软件&#xff0c;家里的网速突然变慢了&#xff0c;也许就是隔壁的小哥哥小姐姐在蹭网络&#xff0c;那么如何避免被蹭网&#xff1f;今天小编给各位小伙伴推荐几款路由器管理软件&#xff0c;发现网络变慢了&a…

网站建设功能要求做男女之间的事情的网站

1.1 APT攻击简介 1.1.1APT攻击概念 网络安全&#xff0c;尤其是Internet互联网安全正在面临前所未有的挑战&#xff0c;这主要就来自于有组织、有特定目标、持续时间极长的新型攻击和威胁&#xff0c;国际上有的称之为APT&#xff08;Advanced Persistent Threat&#xff09;攻…

网站开发公司商业计划书国家备案网查询系统

1 socket本地通信 socket原本是为网络通讯设计的&#xff0c;但后来在socket框架的基础上发展出了一种IPC&#xff08;进程通信&#xff09;机制&#xff0c;即UNIX Domain Socket&#xff0c;专门用来实现使用socket实现的本地进程通信。 本地通信的流程与使用的接口与基于TC…

企顺网网站建设做网站费用上海

文章目录 78. 子集&#xff08;集合的所有子集&#xff09;90. 子集 II&#xff08;集合的所有子集&#xff09;792. 匹配子序列的单词数&#xff08;判断是否为子集&#xff09;500. 键盘行&#xff08;集合的交集&#xff09;409. 最长回文串&#xff08;set&#xff09; 更多…

库存中心(三层库存模型)

目录背景和价值WMS一、货主(Owner)货主(Owner)业务对象的核心属性:3. 库存记录:细化到「SKU+货主+库位」三维度逻辑库存一、逻辑层核心业务对象设计1. 库存主档(LogicalInventory):核心载体参考资料 背景和价…

Valley靶机渗透实战:从凭证复用到Python库劫持

本文详细记录了TryHackMe平台Valley靶机的完整渗透过程,涵盖端口扫描、目录枚举、FTP凭证破解、PCAP分析、SSH登录、UPX脱壳和Python库劫持提权等技术要点。Valley靶机渗透报告 - TryHackMe 本文详细记录了我渗透TryH…

深入解析:IP Search Performance Tests dat/db/xdb/mmdb 结构性能差异对比

深入解析:IP Search Performance Tests dat/db/xdb/mmdb 结构性能差异对比pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-famil…

联盟文明网站建设有新突破建设学校网站需要具备

文章目录 指令和参数筛选器远程指令tasklist参数 windows批处理系列&#xff1a;初步&#x1fa9f;命令行设置 指令和参数 tasklist可以获取当前运行的程序列表。当不加参数时&#xff0c;其返回值包括5列&#xff0c;分别是映像名称&#xff0c;PID&#xff0c;会话名&#…

重庆好的网站制作公司济南seo网站排名优化工具

文 | Flood Sung源 | 知乎前言今年最热门的词汇之一当属内卷了。似乎很多行业都由于份额有限而陷入内卷当中。最火的或许是清华学生的这张图&#xff0c;“骑车写代码”&#xff1a;图片来自网络虽然后来知道是这位同学怕关了屏幕程序就断了&#xff0c;但这不禁让人思考&#…

C++篇:002

C++篇:002$(".postTitle2").removeClass("postTitle2").addClass("singleposttitle");C++篇:002.模板 一、模板概念 函数模板 函数模板的格式: template<typename T1, typename T…

10.05模拟赛反思

打得太差了。 T1 由于限制了 \(60\) 步导致挂掉 \(50 pts\)。写代码的时候不能太想当然了,只是期望每次减半而不是严格的。有时候写代码觉得是对的就写了,但是可能到了很后面才发现有问题,更严重的话根本不知道有问…

MariaDB收购SkySQL增强AI与无服务器能力

开源数据库公司MariaDB重新收购其前子公司SkySQL,整合其具备AI能力的无服务器云数据库平台。此次收购将增强MariaDB Cloud的代理AI功能和向量数据库支持,提升多云部署灵活性。MariaDB收购前子公司SkySQL以增强代理AI…