10、Entity Framework Core 3.1入门教程-执行原生SQL
本文章是根据 微软MVP solenovex(杨旭)老师的视频教程编写而来,再加上自己的一些理解。
视频教程地址:https://www.bilibili.com/video/BV1xa4y1v7rR
GitHub源码:https://github.com/hllive/LearnEFCore3.1
无主键的Entity
- .NetCore3.1允许无主键的Entity或Model
- 它们不会被追踪,相当于是只读的
- 映射到没有主键的Table或View
如何在EFCore中使用原生SQL语句或执行存储过程以及视图
首先执行两个SQL脚本,一个视图和一个存储过程
CREATE VIEW ViewPlayerClub
AS
SELECT p.Id[PlayerId],p.Name[PlayerName],c.Name[ClubName],c.City[ClubCity]
FROM Players p INNER JOIN Clubs c ON p.ClubId=c.Id
GO
CREATE PROCEDURE RemoveGamePlayer
@PlayerId UNIQUEIDENTIFIER
AS
BEGIN
SET NOCOUNT ON;
DELETE FROM GamePlayer WHERE PlayerId=@PlayerId
END
GO
根据视图ViewPlayerClub创建一个类
public class PlayerClub
{
public Guid PlayerId { get; set; }
public string PlayerName { get; set; }
public string ClubName { get; set; }
public string ClubCity { get; set; }
}
再把这个类添加到DBContext中
public DbSet<PlayerClub> PlayerClubs { get; set; }
DbSet使用这个没有主键的类是不行的,怎么才能使用无主键的类呢?
可以在OnModelCreating()方法里设置一下
modelBuilder.Entity<PlayerClub>()
.HasNoKey()//设置没有主键
.ToView("ViewPlayerClub");//如果不写这句,当迁移的时候还会创建一个PlayerClub的Table,应该把这个类映射到一个视图上
针对这种没有主键的model查询出来都是无法追踪的
例子
[HttpGet("PlayerClub")]
public IActionResult GetViewPlayerClub()
{
var playerClub = _dbContext.PlayerClubs.Where(px => px.ClubCity.Contains("贵州")).ToList();
return Ok(playerClub);
}
生成的SQL语句
SELECT [v].[ClubCity], [v].[ClubName], [v].[PlayerId], [v].[PlayerName]
FROM [ViewPlayerClub] AS [v]
WHERE CHARINDEX(N'贵州', [v].[ClubCity]) > 0
如果使用_dbContext.PlayerClubs.Find(Guid id)在编译的时候不会出错,但运行肯定会报错,因为Find()里的参数是主键
原生SQL查询
执行原生SQL查询有两种方法
.FromSqlRaw("SELECT *...")直接写SQL语句.FromSqlRawAsync("SELECT *...").FromSqlInterpolated("$SELECT *...WHERE x={var}")SQL语句需要使用参数.FromSqlInterpolatedAsync("$SELECT *...WHERE x={var}")
FromSqlRaw和FromSqlInterpolated是DbSet()的方法,所以只能针对DbSet方法执行,需要在DbSet()后使用FromSqlRaw
使用FromSqlRaw()方法
[HttpGet("SqlTest")]
public IActionResult GetSqlTest1()
{
var leagues = _dbContext.Leagues.FromSqlRaw("SELECT * FROM Leagues").ToList();
return Ok(leagues);
}
生成的SQL语句就是FromSqlRaw()方法里的语句
使用FromSqlInterpolated()方法
[HttpGet("SqlTest1")]
public IActionResult GetSqlTest1([FromQuery] string name)
{
//使用带参数的FromSqlInterpolated
var leagues = _dbContext.Leagues
.FromSqlInterpolated($"SELECT * FROM Leagues WHERE Name LIKE N'%{name}%'")
.ToList();
return Ok(leagues);
}
生成的SQL语句就是FromSqlInterpolated()方法的语句,但是会使用SQL参数作为查询值
exec sp_executesql N'SELECT * FROM Leagues WHERE Name LIKE N''%@p0%''
',N'@p0 nvarchar(4000)',@p0=N'足球'
原生SQL查询的要求
- 必须返回Entity类型的所有属性,一般都是
SELECT * - 字段名和Entity的属性名必须匹配
- 无法包含关联的数据,不能写JOIN语句
- 只能查询已知的Entity,也就是Context中设定好的或间接能追踪到的数据
执行非查询类SQL
Context.Database.ExecuteSqlRaw()Context.Database.ExecuteSqlRawAsync()Context.Database.ExecuteSqlInterpolated()Context.Database.ExecuteSqlInterpolatedAsync()- 无法用于查询
- 只能返回影响的行数
[HttpGet("SqlTest2")]
public IActionResult GetSqlTest2()
{
//使用ExecuteSqlRaw
var count = _dbContext.Database.ExecuteSqlRaw("EXEC [dbo].[RemoveGamePlayer] {0}", new Guid(""));
//使用ExecuteSqlInterpolated
var counts = _dbContext.Database.ExecuteSqlInterpolated($"EXEC [dbo].[RemoveGamePlayer] {new Guid("")}");
return Ok(new { count, counts });
}
生成的SQL语句两个都一样
博客文章可以转载,但不可以声明为原创
10、Entity Framework Core 3.1入门教程-执行原生SQL的更多相关文章
- 1、Entity Framework Core 3.1入门教程-概述和准备工作
本文章是根据 微软MVP solenovex(杨旭)老师的视频教程编写而来,再加上自己的一些理解. 视频教程地址:https://www.bilibili.com/video/BV1xa4y1v7rR ...
- 3、Entity Framework Core 3.1入门教程-设定字段属性
本文章是根据 微软MVP solenovex(杨旭)老师的视频教程编写而来,再加上自己的一些理解. 视频教程地址:https://www.bilibili.com/video/BV1xa4y1v7rR ...
- 2、Entity Framework Core 3.1入门教程-创建数据库和迁移
本文章是根据 微软MVP solenovex(杨旭)老师的视频教程编写而来,再加上自己的一些理解. 视频教程地址:https://www.bilibili.com/video/BV1xa4y1v7rR ...
- ASP.NET Core 入门教程 8、ASP.NET Core + Entity Framework Core 数据访问入门
一.前言 1.本教程主要内容 ASP.NET Core MVC 集成 EF Core 介绍&操作步骤 ASP.NET Core MVC 使用 EF Core + Linq to Entity ...
- ASP.NET Core 入门笔记9,ASP.NET Core + Entity Framework Core 数据访问入门
一.前言 1.本教程主要内容 ASP.NET Core MVC 集成 EF Core 介绍&操作步骤 ASP.NET Core MVC 使用 EF Core + Linq to Entity ...
- Entity Framework Core 2.0 入门简介
不多说废话了, 直接切入正题. EF Core支持情况 EF Core的数据库Providers: 此外还即将支持CosmosDB和 Oracle. EFCore 2.0新的东西: 查询: EF.Fu ...
- Entity Framework Core 2.0 入门
该文章比较基础, 不多说废话了, 直接切入正题. 该文分以下几点: 创建Model和数据库 使用Model与数据库交互 查询和保存关联数据 EF Core支持情况 EF Core的数据库Provide ...
- (摘)Entity Framework Core 2.1带来更好的SQL语句生成方案
微软发布了Entity Framework Core2.1,为EF开发者带来了很多期待已久的特性.EF Core 2.1增加了对SQL GROUP BY的支持,支持延迟加载和数据种子等. EF Cor ...
- entity framework core在独立类库下执行迁移操作
之前学习EFCore的时候,都是在VS创建的默认模板里面进行的,按照官方文档,直接就可以搞定. 今天新项目准备上.Net Core,打算先按照国际惯例,进行分层,数据访问层是用EFCore来做,于是就 ...
随机推荐
- pandas_查看数据特征和统计信息
# 查看数据特征和统计信息 import pandas as pd # 读取文件 dataframe = pd.read_excel(r'C:\Users\lenovo\Desktop\总结\Pyth ...
- C/C++编程笔记:C语言打造中国象棋游戏,项目源代码分享!
中国象棋是起源于中国的一种棋,属于二人对抗性游戏的一种,在中国有着悠久的历史.由于用具简单,趣味性强,成为流行极为广泛的棋艺活动. 它是中国棋文化,也是中华民族的文化瑰宝,它源远流长,趣味浓厚,基本规 ...
- Selenium多窗口切换代码
# #!/usr/bin/python3 # -*- coding: utf-8 -*- # @Time : 2020/7/31 16:05 # @Author : Gengwu # @FileNam ...
- RNN神经网络产生梯度消失和梯度爆炸的原因及解决方案
1.RNN模型结构 循环神经网络RNN(Recurrent Neural Network)会记忆之前的信息,并利用之前的信息影响后面结点的输出.也就是说,循环神经网络的隐藏层之间的结点是有连接的,隐藏 ...
- jmeter如何设置全局变量
场景:性能测试或者接口测试,如果想跨线程引用(案例:A线程组里面的一个输出,是B线程组里面的一个输入,这个时候如果要引用),这个时候你就必须要设置全局变量;全链路压测也需要分不同场景,通常情况,一个场 ...
- 2020牛客暑期多校训练营(第八场)K-Kabaleo Lite题解
K-Kabaleo Lite 题目大意: 给出每种菜品的利润以及碟数,要求我们给每个客人至少一碟菜,要求从1号菜品开始给,给的菜品的号码是连续的,每个客人同号码的菜都只能给一碟.求能招待客人的最大数量 ...
- Rx.js实现原理浅析
前言 上次给大家分享了cycle.js的内容,这个框架核心模块的代码其实只有一百多行,要理解这个看似复杂的框架,其实最核心的是理解它依赖的异步数据流处理框架--rx.js.今天,给大家分享一下rx.j ...
- C调用C++代码
有时C程序里需要用到C++的类,但是C语言又不能直接调用类,这时需要把C++的类使用C接口封装后,再调用, 可以将封装后的C++代码编译成库文件,供C语言调用: 需要注意的是,封装的C++代码库文件是 ...
- 铁大树洞app功能演示和使用说明
在观看这篇功能博客之前推荐看一下我们设计软件方案博客,可以更好地理解,博客连接:https://www.cnblogs.com/three3/p/12658897.html首先下载我们软件的安装包,点 ...
- Docker 搭建 RabbitMQ
Docker RabbitMQ RabbitMQ 安装非常繁琐,使用 Docker 快速搭建一个 RabbitMQ 开发环境 步骤 拉取镜像 docker pull rabbitmq 启动容器 端口会 ...