在Visual Studio中查看Entity Framework Core (EF Core) 的查询计划对于分析和优化数据库查询性能非常有帮助。...EF Core 提供了一种强大的工具,可以在调试时直接在Visual Studio中可视化查询计划。...如何在Visual Studio中查看EF Core查询计划安装EFCore.Visualizer扩展:在Visual Studio中,通过扩展市场搜索并安装名为 EFCore.Visualizer 的扩展工具...点击这个按钮,即可查看该查询的查询计划。注意,这个功能只支持 IQueryable 变量,不支持已经执行的 List 变量。...return await _context.Products.ToListAsync(); } }使用EFCore.Visualizer查看查询计划:在 GetProducts 方法中
预先加载 使用Include方法指定要包含在查询结果中的关联数据。...() .UseSqlServer(myConnectionString)); EF Core 延迟加载需要属性必须具有是共有的,且具有virtual修饰符,只有这样才可以被子类重写。...EF Core还提供了不使用代理的方式进行延迟加载,此方法需要向实体类中注入ILazyLoader实例,并通过该实例实现get访问: public class Blog { private ICollection...好的一点是,EF Core在设计时就替我们考虑了如何防御SQL注入攻击,因此当我们使用FromSql方法时,参数中如果有使用到拼接字符串的情况,则会自动为我们生成SQL查询参数,例如: var user...在执行查询时,EF Core会检查我们的sql语句是否支持拼接,如果支持的情况下,则会将linq过滤语句拼接为sql一并发送到数据库进行查询。 跟踪 原始SQL中的跟踪与Linq查询的跟踪方式一致。
2、对于IQueryable接口调用非终结方法的时候不会执行查询,而 调用终结方法的时候则会立即执行查询。...5、简单判断:一个方法的返回值类型如果是IQueryable类型,那么这个方法一般就是非终结方法,否则就是终结方法。...EF Core中的异步方法 SaveChanges()、SaveChangesAsync()、AddAsync()、AddRangeAsync()、AllAsync()、AnyAsync、AverageAsync...执行SaveChanges()等方法时,EF Core将会把存储的快照中的值与实体的当前值进行比较。...) 更新到数据库; “已删除”的实体,SaveChanges() 从数据库删除; 查看实体的状态: 使用DbContext的Entry()方法来获得实体在EF Core中的跟踪信息对象EntityEntry
执行的时机是用到这个表达式结果的时候才去执行。 在公司码程序的时候,我看到好多同事用EF,写完查询喜欢直接调用ToList()方法。有时候这会造成很大的性能问题。.... // 建立查询,但不执行 var result = query.ToList(); // 立即执行查询 所以,你应当尽量避免从ToList()后的结果中再去查找自己想要的元素。 ?...很显然,它会被系统中的其他方法调用,而这些调用者希望得到的结果都各不相同。...紧跟其后的“.Posts”是Category对象的导航属性,EF会用lazy load去加载这个category所有的post,所以就生成了第二条SQL语句。...所以,在EF中,要进行Count操作,应该这样写: context.Post.Count(p => p.Categories.Any(q => q.Name == categoryName)); 这时,
{ get; set; } public string Sex { get; set; } } 由于VS版本是逆天的2010,且没有EF,我采用了比较原始的方法,即建立一个mdf...大家可以使用EF或其他方式。...方法,它的目的在于呼叫其配套的provider中的Execute方法,从而令我们自己的逻辑得以执行(我们已经在构造函数中传入了自己的provider): public IEnumerator...一个查询进行执行,就是开始遍历IQueryable的过程,其会调用Execute方法并传递表达式树。 不是所有的表达式树都可以翻译成SQL。例如ToUpper就不行。...将程序员从对SQL语句的拼接(尤其是insert)中解放出来,它既容易错,又很难发现错误。现在插入的对象都是强类型的,就犹如插入一个List一样。
10.除了EF,列举出你知道的ORM框架? 11.在哪些类型额项目中你会选择EF? 为什么? 12.请说明EF中映射实体对象的几种状态? 1.EF(Entity Framework)是什么?...提升从数据库中拿数据的速度,可以参考以下几种方法: 1).在数据库中的表中定义合适的索引和键 2).只获得你需要的列(使用ViewModel或者改进查询)和行(使用IQueryable)...Enumerable这个静态类型含有很多扩展方法,其扩展的目标是IEnumerable。 实现了这个接口的类可以使用Foreach关键字进行迭代(迭代的意思是对于一个集合,可以逐一取出元素并遍历之)。...实现这个接口必须实现方法GetEnumerator。 ---->详解 6.IEnumerable的缺点有哪些? IEnumerable功能有限,不能插入和删除。...大部分LINQ语句是在最终结果的第一个元素被访问的时候(即在foreach中调用MoveNext方法)才真正开始运算的,这个特点称为延迟执行。
(如Web服务器)之间进行通信。...LibraryDbContext和EFCoreEleganceUseEFCoreModule,下面着重详解 二、EFCore框架DBSet配置详解 1.实体统一配置 EF实体继承统一的接口,方便我们反射获取所有...EF实体,接口可以设置一个泛型,来泛化我们的主键类型,因为可能存在不同的表的主键类型也不一样。...m.IsInterface).ToArray(); return efEntities; } } 4.批量注入模型类到EF中 using EFCoreEleganceUse.Domain.Entities...DBContext中作为DBSets,再也不需要一个个写DBSet了,可以用过DbContext.Set()获取用户的DBSet。
多对多关系不像其他关系那么简单,在这篇文章中,我将向您展示如何创建多对多关系以及如何在 EF Core 中使用它们。 模型 多对多的简单而实用的例子可能是某种数字电子商务商店。...在本文发表时,EF Core 无法处理这种情况。...目前,创建复合键的唯一方法是在OnModelCreating. protected override void OnModelCreating(ModelBuilder builder) { base.OnModelCreating...插入多对多 假设我们已经有Cart和Item在我们的数据库中,现在我们想将特定商品(Item)添加到特定购物车(Cart),为了做到这一点,我们需要创建新的CartItem并保存它。...// 获取关联所有商品的指定购物车 var cartIncludingItems = db.Carts.Include(cart => cart.Items).ThenInclude(row => row.Item
当然如果数据来自远端,你还可以选择IQueryable,它不会把资料一股脑拉下来,而是做完所有的筛选之后,才ToList,把资料从远端下载下来。...在EF6中,我们还可以使用这样的方法: ? 注意:编译器不一定能够将你的LINQ语句翻译为SQL,例如字符串的IndexOf方法就不被支持。...XML等,EF没有对应的功能 你的项目对性能要求达到了非常苛刻的程度,导致EF的一些性能可以接受的方法在你这里变成了不能接受。...例如EF使用了反射,但如果你的ORM只用于你开发的软件,所有的情况你都可以事先预计,那你也可以不用反射 而大部分ORM开发出来的目标仅仅是: 令查询语法更加接近SQL 加入了若干语法糖或代码生成快捷方式...使用Reshaper等工具,它可能会在你写出较差的代码时给出提醒。 上MSDN,nuget查询是否已经有了现成的方法(例如获得最后一个元素)。 撰写单元测试来保证你的优化的正确性。
这节来讲一下C#中的内建接口:IQueryable 。 IQueryable是 IEnumerable 接口的子接口,相比之下提供了更丰富的查询功能。...在 C# 中,常用的查询提供者是 Entity Framework(EF),它可以将 IQueryable 查询转换为适当的 SQL 查询语句,并与数据库进行交互以获取结果。...可组合性:IQueryable 查询具有良好的可组合性,我们可以根据需要在查询中添加和组合多个查询操作。这使得我们可以根据不同的条件动态构建查询,以及重复使用和组合查询逻辑。...我们首先创建了一个整数数组 numbers,然后通过 AsQueryable() 方法将其转换为 IQueryable 对象,针对这个查询对象,我们用 Where 方法筛选出偶数,再使用 Select...接下来,我们修改了 numbers 数组中的一个元素,将索引为 2 的元素由 3 修改为 6。 最后,我们通过 foreach 循环遍历查询结果,并将结果打印到控制台上。
泛型IRepository接口用来规范所有仓储都应该具有的基础增删查改方法,这里有2点需要注意: 1)方法返回类型为IQueryable,目的是延迟查询,用过类似EF的ORM的应该都知道; 2)接口有个泛型参数...接下来,再看EF基础实现中Repository的实现,如下: public abstract class Repository : IRepository...,那就涉及到简单CUD的保存,尤其是像基于EF的这种实现中,还他妈必须savechanges才行。。。...,你就应该想到,抽象的目的,是为了切换ORM准备的,假如我想切换为Chloe的实现,那么很简单,改动只需要3处: 1)startup中EFDBContext的注册改为Chole Context的注册,如...MsSqlContext; 2)ChloeUnityOfWork实现IUnitOfWork,构造函数中传入IDbContext,下面的方法实现切换为MsSQLContext的相关事务操作; 3)Repository
它的缺点是:向集合插入元素将会变得低效,它需要给插入的元素腾出位置并顺序移动后面的元素。...线性表不能按照索引进行查找,它是通过对地址的引用来搜索元素的,为了找到某个元素,它必须遍历所有元素,直到找到对应的元素为止。所以,线性表的优点是插入和删除数据效率高,缺点是查找的效率相对来说低一些。...当我们觉得在集合中插入和删除数据很慢时,就可以考虑使用链表。...双向链表中的每个节点都向前指向Previous节点,向后指向Next节点。 在FCL中,非线性集合实现得不多。非线性集合分为层次集合和组集合。层次集合(如树)在FCL中没有实现。...所有的集合类也没有一个可写的迭代器属性。 原因有二 这违背了设计模式中的开闭原则。被设置到集合中的迭代器可能会直接导致集合的行为发生异常或变动。
4、EF中的一些类的命名空间以及一些方法的名字在EF Core中稍有不同。 5、EF不再做新特性增加。...AddAuthorName_ModifyTitle为本次迁移操作的名称 4、执行:Update-Database EF Core操作数据库 插入数据 只要操作Books属性,就可以向数据库中增加数据,...也有同步的保存方法SaveChanges(),但是用EF Core都推荐用异步方法。...EF Core的Where方法返回的是IQueryable类型,DbSet也实现了IQueryable接口。...IQueryable有扩展方法ToQueryString()可以获得SQL IQueryable books = dbContext.Books.Where(b => b.Id == 2)
主要集中增删该查每个模块都有,所以本次是为封装相同接口方法 如果你想了解怎么重构普通的接口DAL层请查看第二节点 如果你只想了解利用T4链接EF生成代码,可以忽略前两节,之后跳后最后T4模版的使用...在编译时,各个部分都必须可用来形成最终的类型。各个部分必须具有相同的可访问性,如 public、private 等。 如果将任意部分声明为抽象的,则整个类型都被视为抽象的。...各个部分可以指定不同的基接口,最终类型将实现所有分部声明所列出的全部接口。在某一分部定义中声明的任何类、结构或接口成员可供所有其他部分使用。最终类型是所有部分在编译时的组合。...代码生成策略 改变生成策略为T4 添加TT模版 重构DAL层 创建ICommonRepository接口 实现ICommonRepository方法 T4模版的使用 1.改变EF代码生成策略旧的...在WriteHeder方法后都是通用的访问代码。我们提取之后的代码。因为安装了T4高亮。
在Entity Framework Core2.0 估计是为了配合ASP.NET Core的日志.所以对这些接口进行了更进一步的包装,也弃用了一些接口和类,如:IRelationalCommandBuilderFactory...,DbCommandLogData 但是Entity Framework Core2.0 在DbContextOptionsBuilder添加了新的扩展方法.UseLoggerFactory 看到LoggerFactory...这里作为例子,只将日志记录在了调试窗口..当然也可以记录在自己的文件中..具体请参考LoggerFactory的相关说明.....我们使用EF Core,所以需要引用它的 Microsoft.EntityFrameworkCore.DynamicLinq 这个库. 这个库针对IQueryable进行了动态条件的扩展.....我们发现,这个库还是很强大的.. 因为它是对IQueryable进行的扩展,所以没有数据库不支持的情况..只要有相关的驱动,就可以基于驱动来生成相关的SQL代码..
在.NET6中微软新增了 TryGetNonEnumeratedCount 方法,让我们可以计算可枚举类型元素的总数。...到这里一定有读者会问:LINQ中已经包含了Count方法,为什么还要增加TryGetNonEnumeratedCount方法呢?...throw new NotImplementedException(); } } 运行上面的代码会发现e.Count()能够执行,但是u.Count()报错,这是LINQ内部实现造成的。...某些集合类型如果无法通过Count属性/方法确定集合元素数量的话,会严重影响程序性能,这是因为Count属性/方法必须枚举整个集合来确定元素数量,例如EF Core中使用IQueryable.Count...因此建议在代码中始终使用如下方式获取可枚举类型的元素总数: if (!
的服务,调用了InitializeSets方法,顾名思义,这个方法其实就是去加载我们的DBSet的,以下是这个接口的实现,从下面的源码中,我们不难看出,这里就是通过IDbSetFinder去查找DBContext...里面去了,这样就创建了DBContext里面的所有的DbSet的Set方法,,但是呢这里是只给构建了DBSet的Set方法,但是还没有调用,相当于此时的DBSet还是null,所以还要继续看DbSetInitializer...IAsyncQueryProvider的实现,按照我们上面的代码来看,实际上最终返回的是EntityQueryable的一个类型,在上一文章中,我们实现过自定义的IQueryable的一个类型,最终自定义的实现的这个...如何自定义批量增删改查替换自带的 在以前记得使用批量插入的时候,总觉得EF自带的很慢,3.1的时候用的,到现在都这么久了,不知道提升性能了没得,不过它的内部依旧和我写的例子 原理差不多,内部开启一个事物...,有时候也不知道怎么讲,因为它不像asp.net core的有序,所以导致讲的时候不知道怎么讲,后续,会继续出关于对EFCORE的源码讲解,可能有的地方依旧会讲得多一点,有的会提供一个大概的类,或者方法名称
思考一下,您现有的应用中是否包含了一个全能的ORM框架(比如EF),那您引入仓储的原因是什么呢? 什么是存储库 好吧,这次的开篇太长了,终于回到了正题:什么是存储库?...通过一个众所周知的接口来提供访问。提供添加和删除对象的方法,用这些方法来封装在数据存储中实际插入或删除数据的操作。...); 这样做的好处是所有的存储库都可以复用这个接口,以后所有的查询都可以通过使用该方来来完成,而不需要再去单独写各种Find方法。...而现在,您可能正在这样做,开放且灵活的约定,再加上延迟的IQueryable对象,让仓储层完全丧失了原有的作用,它反而成了负担,为什么不直接使用DbContext对象呢?...要么就是将存储库的规则打破,直接查询利用EF Core查询出IQueryable集合对象,然后一顿输出猛如虎来达到效果。
0.前言 到目前为止,我们看了一下如何声明EF Core的初步使用,也整体的看了下EF Core的映射关系配置以及导航属性的配置。 这一篇,我带大家分享一下,我在工作中需要的EF Core的用法。...如果在不考虑后续变更或者上下文的复用性,可以直接在自定义Context里重写OnConfiguring方法中定义。...而删除,如果在配置导航属性时,没有设置级联删除,删除当前元素,如果另一端的外键是可空类型的,并不会删除导航属性另一端的元素只会设置外键指向为NULL,如果另一端外键是不可空的,那么就会同时删除。...).Where(t=>true).OrderBy(t=>t.Id); 分页只能通过方法链的形式进行分页,这里提供一个分页的工具方法: public static IQueryable Paging...EF Core在调用 ToList的时候,会将已调用的方法和Linq转换成SQL语句,并正式向数据库发起查询。如果出现了在Linq中调用三方方法或者自己写的工具方法的话,可能会提示不受支持。
对于Linq to object,当集合对象是 IEnumerable 时,对单个对象进行迭代的方式是:先把单个对象走完所有的Linq方法后,直到最后或者执行到返回值不是IEnumerable的Linq...右键单击其中一个lambda语句(方法体)内的任意位置,然后选择“断点 - >插入断点”。断点就打在这个lambda表达式上了。...参考 如何在C#中调试LINQ查询:https://michaelscodingspot.com/debug-linq-in-csharp/ C#中的条件断点:https://www.c-sharpcorner.com...使用OzCode VS插件OzCode很强大,每一个Linq语句的执行结果都能统计并展示出来,详情参考:如何在C#中调试LINQ查询 和 如何在C#中调试LINQ查询 使用LinqPad LinqPad...软件很强大,不过数据源是个问题,操作步骤参考:如何在C#中调试LINQ查询 和 如何在C#中调试LINQ查询 参考 2017年调试LINQ:LINQPad与OzCode:https://oz-code.com
领取专属 10元无门槛券
手把手带您无忧上云