EntityFramework Core数据查询
前言
本节我们再来讲讲EF Core,本节算是回归基础吧,当前项目EF Core还是处于1.1版本中,后续等待.net core等版本稳定了全部会更新到2.0版本中,到时再来更新相关文章分享给大家。
相关数据加载
在EF中一直以来都是通过导航属性来加载一个实体的相关数据,在EF Core中加载相关数据有以下三种模式:
饥饿加载
来自数据库相关联数据的加载也会作为实体的一部分进行加载。
我们通过Include方法来进行饥饿加载实体相关联的数据,如下:
using (var context = new BloggingContext()) { var blogs = context.Blogs .Include(blog => blog.Posts) .ToList(); }
当然我们也可以同时关联实体的多个属性,如下:
using (var context = new BloggingContext()) { var blogs = context.Blogs .Include(blog => blog.Posts) .Include(blog => blog.Owner) .ToList(); }
同时我们也可以类似层级一样来加载一个实体的相关的实体的相关联实体,通过ThenInclude,如下:
using (var context = new BloggingContext()) { var blogs = context.Blogs .Include(blog => blog.Posts) .ThenInclude(post => post.Author) .ToList(); }
是不是只要我们加上了Include方法就会加载一个实体相关联的数据呢,如下:
using (var context = new BloggingContext()) { var blogs = context.Blogs .Include(blog => blog.Posts) .Select(blog => new { Id = blog.BlogId, Url = blog.Url }) .ToList(); }
很明显我们最后只是投影了Blog中的几个字段,所以此时会忽略对Post导航属性的查询。当在这种情况下对于最后返回的数据未包含相关联数据时在日志文件中会进行提醒,在这种情况下我们很明确知道会忽略对导航数据的加载,同时也不会抛出异常,我们可以在日志文件中对该项处理进行忽略,如下:
services.AddDbContext<EFCoreContext>(options => { options.UseSqlServer(sqlStr, d => d.MigrationsAssembly("StudyEFCore")) .ConfigureWarnings(warnings => warnings.Throw(CoreEventId.IncludeIgnoredWarning); });
显式加载
来自数据库相关联数据的加载在稍后会进行加载。
显式加载只有在EF Core1.1版本上才会被支持,通过DbContext.Entry()来实现,如下:
using (var context = new BloggingContext()) { var blog = context.Blogs .Single(b => b.BlogId == 1); context.Entry(blog) .Collection(b => b.Posts) .Load(); context.Entry(blog) .Reference(b => b.Owner) .Load(); }
当然我们也可以通过Linq来加载相关联数据,如下:
using (var context = new BloggingContext()) { var blog = context.Blogs .Single(b => b.BlogId == 1); var postCount = context.Entry(blog) .Collection(b => b.Posts) .Query() .Count(); }
延迟加载
来自数据库相关联数据的加载当导航属性被访问时会被加载,在EF Core中可能将会实现。
客户端数据评估进行翻译
在EF Core中不像之前EF版本对于在lambda表达式中对数据进行操作此时将导致无法翻译从而出错,但是在EF Core中对于一些简单的数据可以进行了翻译,这一点还是让我们有了一点期待。我们一起来看看。
public class Sample { public static string StandardizeUrl(string url) { url = url.ToLower(); if (!url.StartsWith("http://")) { url = string.Concat("http://", url); } return url; } public static void Run() { using (var context = new BloggingContext()) { var blogs = context.Blogs .OrderByDescending(blog => blog.Rating) .Select(blog => new { Id = blog.BlogId, Url = StandardizeUrl(blog.Url) }) .ToList(); } using (var context = new BloggingContext()) { var blogs = context.Blogs .Where(blog => StandardizeUrl(blog.Url).Contains("dotnet")) .ToList(); } } }
同时这种对于代码进行评估进行翻译的情况我们也可以进行禁用,如下:
services.AddDbContext<EFCoreContext>(options => { options.UseSqlServer(sqlStr, d => d.MigrationsAssembly("StudyEFCore")) .ConfigureWarnings(warnings => warnings.Throw(RelationalEventId.QueryClientEvaluationWarning)); });
总结
本文简单讲解了下EF Core中相关数据加载的三种模式以及对于客户端数据能够进行简单的翻译,我们下节再见。

为了方便大家在移动端也能看到我分享的博文,现已注册个人公众号,扫描上方左边二维码即可,欢迎大家关注,有时间会及时分享相关技术博文。
感谢花时间阅读此篇文章,如果您觉得这篇文章你学到了东西也是为了犒劳下博主的码字不易不妨打赏一下吧,让楼主能喝上一杯咖啡,在此谢过了!
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!
本文版权归作者和博客园共有,来源网址:http://www.cnblogs.com/CreateMyself)/欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构