前言

本节我们再来讲讲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 == ); 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 == ); 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中相关数据加载的三种模式以及对于客户端数据能够进行简单的翻译,我们下节再见。

EntityFramework Core数据查询的更多相关文章

  1. EntityFramework Core笔记:查询数据(3)

    1. 基本查询 1.1 加载全部数据 using System.Linq; using (var context = new LibingContext()) { var roles = contex ...

  2. EntityFramework Core查询问题集锦(一)

    前言 和大家脱离了一段时间,有时候总想着时间挤挤总是会有的,但是并非人愿,后面会借助周末的时间来打理博客,如有问题可以在周末私信我或者加我QQ皆可,欢迎和大家一起探讨,本节我们来讨论EF Core中的 ...

  3. EntityFramework Core 2.0执行原始查询如何防止SQL注入?

    前言 接下来一段时间我们来讲讲EntityFramework Core基础,精简的内容,深入浅出,希望为想学习EntityFramework Core的童鞋提供一点帮助. EntityFramewor ...

  4. EntityFramework Core 2.0 Explicitly Compiled Query(显式编译查询)

    前言 EntityFramework Core 2.0引入了显式编译查询,在查询数据时预先编译好LINQ查询便于在请求数据时能够立即响应.显式编译查询提供了高可用场景,通过使用显式编译的查询可以提高查 ...

  5. Webservice WCF WebApi 前端数据可视化 前端数据可视化 C# asp.net PhoneGap html5 C# Where 网站分布式开发简介 EntityFramework Core依赖注入上下文方式不同造成内存泄漏了解一下? SQL Server之深入理解STUFF 你必须知道的EntityFramework 6.x和EntityFramework Cor

    Webservice WCF WebApi   注明:改编加组合 在.net平台下,有大量的技术让你创建一个HTTP服务,像Web Service,WCF,现在又出了Web API.在.net平台下, ...

  6. Cookies 初识 Dotnetspider EF 6.x、EF Core实现dynamic动态查询和EF Core注入多个上下文实例池你知道有什么问题? EntityFramework Core 运行dotnet ef命令迁移背后本质是什么?(EF Core迁移原理)

    Cookies   1.创建HttpCookies Cookie=new HttpCookies("CookieName");2.添加内容Cookie.Values.Add(&qu ...

  7. 我的EntityFramework(2):简单的数据查询

    原文:我的EntityFramework(2):简单的数据查询 在上一篇博文中,已经搭建了基本的框架,接下来就进行简单的数据查询,这里主要用了Linq 常见的数据集查询 var companyList ...

  8. EntityFramework Core笔记:表结构及数据基本操作(2)

    1. 表结构操作 1.1 表名 Data Annotations: using System.ComponentModel.DataAnnotations.Schema; [Table("R ...

  9. IdentityServer4 中文文档 -16- (快速入门)使用 EntityFramework Core 存储配置数据

    IdentityServer4 中文文档 -16- (快速入门)使用 EntityFramework Core 存储配置数据 原文:http://docs.identityserver.io/en/r ...

随机推荐

  1. [C#]使用dnSpy对目标程序(EXE或DLL)进行反编译修改并编译运行

    本文为原创文章.源代码为原创代码,如转载/复制,请在网页/代码处明显位置标明原文名称.作者及网址,谢谢! 本文使用的工具下载地址为: https://github.com/cnxy/dnSpy/arc ...

  2. 一道变态的Javascript面试题

    转载http://cymoft.blog.51cto.com/324099/1260099 1 2 3 4 5 6 7 8 9 f = function() {return true;};  g =  ...

  3. 微信小程序的网络设置,及网络请求:wx.request(OBJECT)

    Md2All 一个Markdown在线转换工具 网址:http://md.aclickall.com 微信公众号:颜家大少本文所用排版工具:http://md.aclickall.com 支持通用的M ...

  4. [最短路]信使(msner)

    [题目描述] 战争时期,前线有n个哨所,每个哨所可能会与其他若干个哨所之间有通信联系.信使负责在哨所之间传递信息,当然,这是要花费一定时间的(以天为单位).指挥部设在第一个哨所.当指挥部下达一个命令后 ...

  5. 最大信息系数(MIC)——Detecting Novel Associations in Large Data Sets

    本文介绍了一种发现两个随机变量之间依赖关系强度的度量MIC(最大信息系数,类似于相关系数的作用).MIC具有以下性质和优势: MIC度量具有普适性.其不仅可以发现变量间的线性函数关系,还能发现非线性函 ...

  6. Python之int内部功能介绍

    int内部功能的介绍 type(): 1.基本数据类型使用type()函数时,得到相应的数据类型a = 12b = 12.01c = "123"print(type(a)) > ...

  7. 【架构篇】OCP和依赖注入

    描述 本篇文章主要讲解 : (1)OO设计OCP原则: (2)依赖注入引入 (3)依赖注入分析 (4)依赖注入种类 1   内容区 1.1   IOC背景 (1)Ralph E. Johnson &a ...

  8. 快速搭建一个本地的FTP服务器

    快速搭建一个本地的FTP服务器   如果需要开发FTP文件上传下载功能,那么需要在本机上搭建一个本地FTP服务器,方便调试. 第一步:配置IIS Web服务器 1.1 控制面板中找到"程序& ...

  9. Webpack飞行手册

    前言 在学习 Webpack 之前,我们需要了解一个概念:模块. 何为模块? 如果你曾学过 Java , C# 之类的语言,一定会知道 Java 中的 import 或 C# 中的 using 吧? ...

  10. Android OpenGL ES 开发(三): OpenGL ES 定义形状

    在上篇文章,我们能够配置好基本的Android OpenGL 使用的环境.但是如果我们不了解OpenGL ES如何定义图像的一些基本知识就使用OpenGL ES进行绘图还是有点棘手的.所以能够在Ope ...