跟着杨中科学习(六)EFCore(四)

news/2024/10/1 9:42:48

自引用的组织结构树

class OrgUnit
{public long Id { get; set; }public long? ParentId { get; set; }public string Name { get; set; }public OrgUnit? Parent { get; set; }public List<OrgUnit> Children { get; set; } = new List<OrgUnit>(); 
}
 class OrgUnitConfig : IEntityTypeConfiguration<OrgUnit>{public void Configure(EntityTypeBuilder<OrgUnit> builder){builder.ToTable("T_OrgUnits");builder.HasKey(o => o.Id);builder.Property(o => o.Name).IsUnicode().IsRequired().HasMaxLength(50);//根节点可空builder.HasOne<OrgUnit>(o => o.Parent).WithMany(u => u.Children).HasForeignKey(o=>o.ParentId).OnDelete(DeleteBehavior.Restrict);}}
static async Task Main (stringL] args)
{//既可以设置一个ou的Parent,也可以把一个节点加入父节点的Children.Add( ... )OrgUnit ouRoot= new OrgUnit{Name="中科集团全球总部”};OrgUnit ouAsia = new OrgUnit{Name="中科集团亚太区总部”};ouAsia. Parent = ouRoot;OrgUnit ouAmerica = new OrgUnit{Name="中科集团美洲总部”};ouAmerica. Parent = ouRoot:ouRoot.Children.Add(ouAsia);ouRoot.Children.Add(ouAmerica);OrgUnit ouUSA=new OrgUnit{Name="中科美国”};ouUSA. Parent = ouAmerica;ouAmerica.Children.Add(ouUSA);                           OrgUnit ouCan= new OrgUnit{Name=”中科加拿大”};ouCan. Parent = ouAmerica;ouAmerica.Children.Add(ouCan);     OrgUnit ouChina = new OrgUnit {Name=”中科集团(中国)”};ouChina. Parent = ouAsia;ouAsia.Children.Add(ouChina);                          OrgUnit ouSg= new OrgUnit{Name=”中科集团(新加坡)”};ouSg. Parent = ouAsia;ouAsia.Children.Add(onSg);                           using(MyDbContext ctx = new MyDbContext ()){ctx.OrgUnits.Add (ouRpot);await ctx.SaveChangesAsync();}
}
只指定children也行

打印子节点

///<summary>
///缩进打印parent的所有的子节点
///</summary>
///<param name="identLeve1"></param>
///<param name="ctx"></param>
///<param name="parent ></param>static void PrintChildren(int identLeve1, MyDbContext ctx, OrgUnit parent)
{//不ToList()得到是IQueryble类型,这是延迟加载,会出现上述问题var children = ctx. OrgUnits. Where(o=>o. Parent==parent);foreach (var child in children){Console. WriteLine(new String('\t', identLeve1)+child.Name);PrintChildren(identLeve1+1,ctx,child);//打印以我为父节点的子节点}
}

一对一

一对一的关系配置必须在其中的一个实体类中声明一个外键属性。

builder.HasOne<Delivery>(o =>o.Delivery).WithOne(d =>d.Order).HasForeignKey<Delivery>(d=>d.OrderId);

在哪个实体类中配置外键,就在哪个实体类中进行连接的数据存储。

多对多

需要中间表进行中转

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>();
}

配置多对多的表关系Config

builder.HasMany<Teacher>(s=>s.Teachers).WithMany(t=>t.Students).UsingEntity(j=>j.ToTable("T_Students_Teachers"));
//需要配置一个中间关系表

拿取所有的教师和对应的学生

var teachers = ctx. Teachers. Include(t => t. Students)
foreach (var t in teachers)
{Console. WriteLine(t. Name) ;foreach (var s in t. Students){Console. WriteLine("\t"+s.Name);}
}

EFCore基于关系的复杂查询

一对多的关系语句查询

var items = ctx. Articles. Where(a=>a. Comments. Any(c=>c. Message. Contains("微软")));
foreach (var item in items)
{Console. WriteLine (item. Title);
}
var items = ctx. Comments. Where(c => c.Message. Contains("微软")).Select(c=>c. TheArticle). Distinct();
foreach (var item in items)
{Console. WriteLine(item.Tit1e);
}                                                         

IEnumerable和IQueryable区别

IEnumerable是客户端评估

IQueryable是服务器端评估

  • IEnumerable 通常与立即执行的查询相关联。当你对一个实现了 IEnumerable 的集合进行查询时,查询操作通常会立即执行。

  • IQueryable支持延迟执行。这意味着查询操作直到迭代或转换为IEnumerable` 之前都不会执行。这在处理数据库查询时非常有用,可以减少不必要的数据传输。

  • 使用 IEnumerable 可能在处理大量数据时导致性能问题,因为数据可能需要在内存中加载和处理。

  • 使用 IQueryable 可以提高性能,因为它允许数据库执行查询,利用数据库的优化和索引。

  • 由于 LINQ 扩展方法的存在,IEnumerableIQueryable 都可以使用相同的查询语法,但是它们背后的执行机制不同。

  • 当你需要对内存中的数据集合进行查询时,使用 IEnumerable

  • 当你需要对数据库或其他数据源进行查询,并且希望利用数据库的查询优化时,使用 IQueryable

IQueryable的延迟执行

未使用变量不执行。不遍历不执行

  1. IQueryable只是代表一个“可以放到数据库服务器去执行的查
    询”,它没有立即执行,只是“可以被执行”而已。

  2. 对于IQueryable接口调用非终结方法的时候不会执行查询,而调
    用终结方法的时候则会立即执行查询。

  3. 终结方法:遍历、ToArray()、ToList()、Min()、Max()、Count()
    等:

  4. 非终结方法:GroupBy()、OrderBy()、Include()、Skip()、
    Take()等。

  5. 简单判断:一个方法的返回值类型如果是IQueryable类型,那 么
    这个方法一般就是非终结方法,否则就是终结方法。

    通过使用延迟执行,可以组合出复杂的动态的sql查询语句

IQueryable可以被复用

IQueryable是一个待查询的逻辑,因此它是可以被重复使用的。

IQueryable<Book> books = ctx.Books.Where(b=>b.Price <= 8);
Console.WriteLine(books.Count());
Console. WriteLine(books.Max(b=>b.Price));
var books2 = books.Where(b=>b.PubTime.Year>2000);

分页查询

使用Skip().Take()来实现分页查询的功能。

需要知道满足条件的数据的总条数:使用IQueryable的复用。

LongCount(Long类型的总数)和Count(总数),这两个是linq的函数

pageSize:每页的数据的数量

pageIndex页码

每一页获得的数据

Skip((pageIndex-1)*pageSize).Take(pageSize)

总页数:

long pageCount=(long)Math.Ceiliing(count*1.0/pageSize);

math.Ceiling-----向上取整

IQueryable底层就是在调用DataReader,内存占用小,但是DB线程占用时间长。

  • 遍历IQueryable并且进行数据处理的过程很耗时。
  • 如果方法需要返回查询结果,并且在方法里销毁DhContext的活,是不能返回IQueryable的。必须一次性加载返回。
  • 多个IQueryable的遍历嵌套。很多数据库的ADO.NET Core Provider是不支持多个DataReader同时执行的。把连接字符串中的MultipleActiveResultSets=true洲掉,其他数据库不支持这个。
foreach (var a in ctx. Articles. ToArray ())
{Console. WriteLine(a. Title);foreach (var c in ctx. Comments. ToArray ()){ Console. WriteLine(c. Message);}
}

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

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

相关文章

AI智能创作工具:ChatMoney,一键创作,让你的公众号文章爆款!

本文由 ChatMoney团队出品引言 想不想你的公众号文章一炮而红?是不是羡慕那些动不动就10W+的爆款文章?别眼红了,用ChatMoney,你也可以做到!这货可不是普通的写作工具,它是你的文章变成金钥匙的魔法师。一按键,爆款文章就来啦!粉丝、点赞、转发,全都哗啦啦地来。好奇怎…

智慧农业的新篇章:水肥一体机的崛起及其深远影响

随着科技的飞速发展,传统农业正迎来一场深刻的变革。在这场变革中,水肥一体机以其独特的智能供水供肥方案,正逐步崭露头角,成为推动农业现代化进程的关键力量。 一、水肥一体机的独特魅力与功能 水肥一体机,作为一种先进的农业装备,将灌溉与施肥两大功能完美融合。它借助…

这里展示一下我们的成果页面吧

这里我们的主要功能语言对话无法展示且动画人物是动态的(如下图)

高一高考集训总结赛

$\quad $ 直接变堂食,考试完不到3分钟我的分数翻倍了(👀) T1 忘八棋$\quad $ 直接四层循环枚举状态即可,\(O(30^4)\)。开始一眼五层循环,不但 T 了还 WA 了,考完试cpa告诉我枚举的时候位置就确定了,直接变消愁🤡。点击查看代码#include<bits/stdc++.h>using n…

本地搭建otlp

采集+监控2.0 1.应用 LB 配置文件,nginx自带的ngx_http_stub_status_module提供的/nginx_status(可自定义命名)端点输出的是nginx自己的简单状态信息 vim InforSuiteLB/conf/InforSuiteLB.conf<!-- <jvm-options>-Dotel.jmx.config=${com.sun.aas.installRoot}/lib…

Fluid 1.0 版发布,打通云原生高效数据使用的“最后一公里”

得益于云原生技术在资源成本集约、部署运维便捷、算力弹性灵活方面的优势,越来越多企业和开发者将数据密集型应用,特别是 AI 和大数据领域应用,运行于云原生环境中。然而,云原生计算与存储分离架构虽然带来了资源经济性与扩容灵活性方面的优势,但也引入了数据访问延迟高、…

springboot Invalid bound statement (not found): com.elitel.xxx.dao.xxx 错误处理

如果这篇文章能给你带来帮助,不胜荣幸,如果有错误也请批评指正,一起学习,共同进步!今天给同事看了个问题,发现了这个问题,之前也遇见过,可是没有遇见这种情况,这次我记录一下。首先来说,造成这个错误的原因是什么。它是在Spring Boot应用程序中遇到“Invalid bound s…

yrx24题万籁俱寂

fiddler抓包会被检测,可以用Charles抓包。 用的http2.0协议,不能用request请求,可以用httpx来请求拿到数据