EntityFramework Core笔记:查询数据(3)
1. 基本查询
1.1 加载全部数据
using System.Linq;
using (var context = new LibingContext())
{
var roles = context.Roles.ToList();
}
1.2 加载单个实体
using (var context = new LibingContext())
{
var role = context.Roles.FirstOrDefault(t => t.RoleID == );
}
using (var context = new LibingContext())
{
var role = context.Roles.Find();
}
注:Find()根据主键值查询返回单个实体。
1.3 筛选条件
using (var context = new LibingContext())
{
var roles = context.Roles
.Where(t => t.RoleName == "管理员")
.ToList();
}
2. 加载关联数据
Entity Framework Core可以在实体模型中使用导航属性,来加载关联数据。
常见的3中关联数据加载方式:
(1)预先加载(Eager Loading):关联数据作为初始查询的一部分从数据库中加载
(2)显式加载(Explicit Loading):关联数据在后续用到时显式指定从数据中加载
(3)延迟加载(Lazy Loading):关联数据通过导航属性,以透明方式从数据库中加载
2.1 预先加载
使用Include()指定需要包含在查询结果中的关联数据。
using System.Linq;
using Microsoft.EntityFrameworkCore;
using (var context = new LibingContext())
{
var categories = context.Categories
.Include(t => t.Products)
.ToList();
}
2.2 显式加载
显式加载通过一个导航属性DbContext.Entry(...)API。
using (var context = new LibingContext())
{
var category = context.Categories.Find(); context.Entry(category)
.Collection(t => t.Products)
.Load(); category.Products.ForEach(product =>
{
Console.WriteLine("ProductID:{0},ProductName:{1}", product.ProductID, product.ProductName);
});
}
显式加载通过相关的实体的聚合运算符,而无需加载到内存的操作。
using (var context = new LibingContext())
{
var category = context.Categories.Find(); int count = context.Entry(category)
.Collection(t => t.Products)
.Query()
.Count();
}
筛选加载到内存的关联实体数据。
using (var context = new LibingContext())
{
var category = context.Categories.Find(); var products = context.Entry(category)
.Collection(t => t.Products)
.Query()
.Where(t => t.UnitPrice >= )
.ToList();
}
3. 跟踪与非跟踪
3.1 跟踪查询
Entity Framework Core跟踪状态的实体,在检测到改动的情况下,调用SaveChanges()时,将持久保存数据库中。
using (var context = new LibingContext())
{
var product = context.Products.Find();
product.UnitPrice = 100m; context.SaveChanges();
}
3.2 非跟踪查询
非跟踪查询在对查询数据只读情况下,可以加快执行。
using (var context = new LibingContext())
{
var products = context.Products
.AsNoTracking()
.ToList();
}
更改默认跟踪上下文实例级别的行为:
using (var context = new LibingContext())
{
context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking; var products = context.Products
.ToList();
}
3.3 跟踪与投影
即使查询的结果类型不是实体类型,如果结果包含实体类型它们将仍在默认情况下跟踪。
在下面的查询,它返回匿名类型的实例Category
集将跟踪结果中。
using (var context = new LibingContext())
{
var categories = context.Categories
.Select(t => new
{
Category = t,
Products = t.Products.Count()
});
}
如果结果集不包含任何实体类型,会不执行任何跟踪。
在下面的查询,这将返回一个匿名类型使用某些实体(但不实际实体类型的实例)中的值时,没有任何跟踪执行。
using (var context = new LibingContext())
{
var products = context.Products
.Select(t => new
{
ProductID = t.ProductID,
PrudctName = t.ProductName
});
}
4. 原始SQL查询
EntityFramework Core使用原始SQL查询限制条件:
(1)SQL查询返回字段必须属于实体类型
(2)SQL查询必须返回实体类型的所有属性
4.1 基本原始SQL查询
使用FromSql扩展方法,基于原始的 SQL 查询的 LINQ 查询。
using (var context = new LibingContext())
{
var products = context.Products
.FromSql("SELECT * FROM [dbo].[Product]")
.ToList();
}
使用原始的 SQL 查询来执行存储的过程。
CREATE PROCEDURE USP_GetProducts
AS
BEGIN
SELECT * FROM [dbo].[Product]
END
using (var context = new LibingContext())
{
var products = context.Products
.FromSql("EXECUTE [dbo].[USP_GetProducts]")
.ToList();
}
4.2 传递参数
SQL参数化可以防止收到SQL注入攻击。
CREATE PROCEDURE USP_GetProductsByUnitPrice
@UnitPrice DECIMAL(18, 2)
AS
BEGIN
SELECT * FROM [dbo].[Product]
WHERE [UnitPrice] >= @UnitPrice
END
using (var context = new LibingContext())
{
decimal unitprice = 100m;
var products = context.Products
.FromSql("EXECUTE [dbo].[USP_GetProducts] {0}", unitprice)
.ToList();
}
using System.Data;
using System.Data.SqlClient;
using (var context = new LibingContext())
{
var unitprice = new SqlParameter("@UnitPrice", SqlDbType.Decimal);
unitprice.Value = 100m; var products = context.Products
.FromSql("EXECUTE [dbo].[USP_GetProducts] @UnitPrice", unitprice)
.ToList();
}
5. 异步查询
异步操作使用场景:当等待一个比较耗时的操作时,使用异步来释放当前的托管线程而无需等待,不会阻塞当前线程的运行。
异步操作在主应用程序线程以外的线程中执行,应用程序可在异步方法执行其任务时继续执行。
异步查询在数据库中执行查询时可以避免阻止线程。
Entity Framework Core提供的异步查询扩展方法包括:ToListAsync(),ToArrayAsync(),SingleAsync()等。
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
public async Task<List<Product>> GetProductsAsync()
{
using (var context = new LibingContext())
{
return await context.Products.ToListAsync();
}
}
EntityFramework Core笔记:查询数据(3)的更多相关文章
- EntityFramework Core笔记:表结构及数据基本操作(2)
1. 表结构操作 1.1 表名 Data Annotations: using System.ComponentModel.DataAnnotations.Schema; [Table("R ...
- EntityFramework Core笔记:入门(1)
1. 安装运行环境 EntityFramework Core运行环境,安装NuGget包: //Sql Server Database Provider PM> Install-Package ...
- EntityFramework Core笔记:保存数据(4)
1. 基本保存 每个DBContext实例都有一个ChangeTracker,负责跟踪需要写入数据库的更改.当实例发生更改时,更改会被记录在ChangeTracker中,在调用 SaveChanges ...
- EntityFramework Core数据查询
前言 本节我们再来讲讲EF Core,本节算是回归基础吧,当前项目EF Core还是处于1.1版本中,后续等待.net core等版本稳定了全部会更新到2.0版本中,到时再来更新相关文章分享给大家. ...
- 03-EF Core笔记之查询数据
EF Core使用Linq进行数据查询. 基本查询 微软提供了一百多个示例来演示查询,地址:https://code.msdn.microsoft.com/101-LINQ-Samples-3fb98 ...
- EntityFramework Core查询问题集锦(一)
前言 和大家脱离了一段时间,有时候总想着时间挤挤总是会有的,但是并非人愿,后面会借助周末的时间来打理博客,如有问题可以在周末私信我或者加我QQ皆可,欢迎和大家一起探讨,本节我们来讨论EF Core中的 ...
- EntityFramework Core 2.0执行原始查询如何防止SQL注入?
前言 接下来一段时间我们来讲讲EntityFramework Core基础,精简的内容,深入浅出,希望为想学习EntityFramework Core的童鞋提供一点帮助. EntityFramewor ...
- EntityFramework Core 2.0 Explicitly Compiled Query(显式编译查询)
前言 EntityFramework Core 2.0引入了显式编译查询,在查询数据时预先编译好LINQ查询便于在请求数据时能够立即响应.显式编译查询提供了高可用场景,通过使用显式编译的查询可以提高查 ...
- 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平台下, ...
随机推荐
- Mybatis框架基础支持层——反射工具箱之MetaClass(7)
简介:MetaClass是Mybatis对类级别的元信息的封装和处理,通过与属性工具类的结合, 实现了对复杂表达式的解析,实现了获取指定描述信息的功能 public class MetaClass { ...
- mysql过程函数的建立与使用
记一次数据库函数的学习:工作中接口出现问题,导致页面数据显示错误,跟踪代码查看,最后找到sql语句中,但是sql比较复杂,同时调用了大量的函数,以此记录mysql函数的学习. 首先创建一个函数 选择参 ...
- 实现PHP内部的通知机制,如当一个类的属性发生变化时,另外一个类就可以收到通知
设计模式:观察者模式 当一个对象的状态发生改变时,依赖他的对象会全部收到通知,并自动更新. 使用场景 一个事件发生后,要执行一连串更新操作.传统的编程方式,就是在事件的代码之后直接加入处理逻辑,当更新 ...
- Dynamics 365-如何指定邮件收件人的地址
如果CRM Entity勾选了Sending Email,那么这个Entity的Records是可以直接作为Email的收件人使用的,而邮件地址是Entity的Primary Email字段. 在我们 ...
- Android为TV端助力 关于4.0之后不能直接获取SD卡外部存储路径的问题
Environment.getExternalStorageDirectory()是Android 2.x时代的产物,那时Android主流设备只有很小的内置存储器,然后都会外置一张sd卡,那时这个方 ...
- Docker入门笔记
Docker入门笔记 随笔记录初学Docker遇到的问题, 以免下次再犯. 本机系统Ubuntu18.04 安装 Docker有2个版本 Community Edition (CE) 社区版(免费) ...
- Vue一个案例引发「动画」的使用总结
项目开发中动画有着很重要的作用,而且也是用到的地方非常多,例如:鼠标的进入离开,弹窗效果,组件的显示隐藏,列表的切换等等,可以说我们网页上的动画无处不在,也有人说了,这些东西也可以不使用动画. 对,你 ...
- Docker 架构(二)【转】
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器. Docker 容器通过 Docker 镜像来创建. 容器与镜像的关系类似于面向对象编程中的对象与类 ...
- 南邮攻防训练平台逆向第四题WxyVM
下载文件elf文件,运行输入flag,用ida打开逆向算法: 不是很复杂,可以看出flag长度需要24,最终会和已给出dword_601060进行比较,一致则成功,那么现在只需要看上面的sub_400 ...
- 阿里云上的Centos 7.6的一次Nginx+Mysql+PHP7.3 部署
阿里云申请了一台服务器 Centos 7.6,每次安装都要上网找一大堆教程,因为不熟悉,因为总是忘记. 所以,有时间的时候,还是记录下自己的学习过程,有助于下次的问题解决. 我先总结下: 1)安装VS ...