首页 > 其他分享 >跟着杨中科学习(六)EFCore(四)

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

时间:2024-06-13 17:21:17浏览次数:18  
标签:Name IQueryable OrgUnit 中科 EFCore new 查询 public 跟着

自引用的组织结构树

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

标签:Name,IQueryable,OrgUnit,中科,EFCore,new,查询,public,跟着
From: https://www.cnblogs.com/guan-tou6/p/18246339

相关文章

  • 【Nature子刊】最争气国人友好“灌水刊”,中科院3区升2区,录用仅1个月,2天见刊!
    本周投稿推荐SSCI• 中科院2区,6.0-7.0(录用友好)EI•各领域沾边均可(2天录用)CNKI•7天录用-检索(急录友好)SCI&EI•4区生物医学类,0.5-1.0(录用率99%)•1区工程类,6.0-7.0(进展超顺)•IEEE(TOP),7.5-8.0(实力强刊)期刊亮点中科院3区升2区,期刊质量持续攀升;收稿量庞大,接受......
  • 跟着杨中科学习(五)EFCore(三)
    通过代码查看EFCore自动生成的数据1.标准日志//依赖注入的使用方式publicstaticreadonlyILoggerFactoryMyLoggerFactory=LoggerFactory.Create(builder=>{builder.AddConsole();});optionsBuilder.UseLoggerFactory(MyLoggerFactory);//普通方式classMyDbCo......
  • 无线通信SCI期刊,中科院一区TOP,IF=12.9,专业性强,文章质量高
    一、期刊名称IEEEWirelessCommunications二、期刊简介概况期刊类型:SCI学科领域:无线通信影响因子:12.9中科院分区:1区TOP三、期刊征稿范围IEEE无线通信是为在通信和网络社区工作的个人设计的。它涵盖了与所有媒体(以及媒体组合)和所有协议层的个性化、位置独立通信相......
  • 计算机SCI期刊,中科院3区,IF=3.4,难度不大,无预警风险
    一、期刊名称AutomatedSoftwareEngineering二、期刊简介概况期刊类型:SCI学科领域:计算机科学影响因子:3.4中科院分区:3区三、期刊征稿范围自动化软件工程是一份档案,同行评审的期刊,发表研究,教程论文,调查和自动化软件工程技术的基础,技术,工具和应用方面的重要行业经验......
  • 能源SCI期刊,中科院1区TOP,IF=8.7,审稿速度快,对国人非常友好
    一、期刊名称RenewableEnergy二、期刊简介概况期刊类型:SCI学科领域:能源影响因子:8.7中科院分区:1区TOP三、期刊征稿范围《可再生能源》杂志旨在促进和传播有关可再生能源系统和组件的各种主题和技术的知识。该杂志旨在为研究人员,工程师,经济学家,制造商,非政府组织,协会......
  • 大学体育(二)(华中科技大学) 中国大学MOOC答案2024版100分完整版
    大学体育(二)(华中科技大学)中国大学MOOC答案2024版100分完整版有氧运动有氧运动单元测验1、世界卫生组织对18-64岁年龄组成年人的运动建议是:每周至少()分钟的中等强度有氧身体活动,或者每周至少()分钟的较高强度有氧身体活动,或中等和较高强度两种活动相当量的组合。A:150......
  • 跟着GPT学习Java线程中断机制
    Java中的线程中断是一个复杂但非常重要的概念,它允许一个线程告知另一个线程希望它停止正在做的事情。这个机制是协作式的,意味着被请求中断的线程需要自己检查中断状态,并且决定如何响应中断请求。下面我将系统地讲解Java中的线程中断知识点。 1.中断标志每个线程都有一个内部......
  • 跟着杨中科学习(四)EFCore(二)
    主键自增主键自动增长。优点:简单;缺点:数据库迁移以及分布式系统中比较麻烦;并发性能差。long、int等类型主键,默认是自增。因为是数据库生成的值,所以SaveChanges后会自动把主键的值更新到Id属性。试验一下。场景:插入帖子后,自动重定向帖子地址。自增字段的代码中不能......
  • 计算机SCI期刊,中科院2区,IF=6.9,收稿范围非常广泛
    一、期刊名称JournalofKingSaudUniversity—ComputerandInformationSciences二、期刊简介概况期刊类型:SCI学科领域:计算机科学影响因子:6.9中科院分区:2区三、期刊征稿范围《沙特国王大学计算机与信息科学杂志》是一本国际性的参考期刊,涵盖了计算机基础及其实......
  • EFCore和EF6的使用和区别
    1、Sqlserver是微软的亲儿子,很少会报错,EF报错问题最多出现在Mysql。以下使用mysql为例子C#一般很形象,带Core的都是.NetCore平台的。所以在.NetFramework平台我们使用EF6,也就是EntityFramework6在.NetCore平台使用EFCore2、直接上代码(.Net6)internalclassProgram{......