第七节:EF Core调用SQL语句和存储过程
一. 查询类
EFCore2.x中用 FromSql 方法,EFCore3.x中用 FromSqlRaw 方法,二者使用起来基本一致。
1.说明
A. SQL查询必须返回实体的所有属性字段。
B. 结果集中的列名必须与属性映射到的列名相匹配。
C. SQL查询不能包含关联数据
D. 除Select以为的其它SQL语句无法运行。
2.调用SQL语句的几种情况
A. 基本的原生SQL查询
B. 利用$内插语法进行传递
C. 原生SQL与linq语法相结合
D. 利用SqlParameter进行参数化查询
代码分享:(2.x版本的写法)
{
using (EFDB01Context db = new EFDB01Context())
{
//1.基本的原生SQL查询
var userList1 = db.Set<T_UserInfor>().FromSql("select * from T_UserInfor where id!='123'").ToList();
//2.利用$内插语法进行传递
var myId = "2fc343069e0a4a559b62b08d5999dbcd";
var userList2 = db.Set<T_UserInfor>().FromSql($"select * from T_UserInfor where id= {myId}").ToList();
//3.原生SQL与linq语法相结合
var userList3 = db.Set<T_UserInfor>().FromSql($"select * from T_UserInfor")
.Where(u => u.id == "2fc343069e0a4a559b62b08d5999dbcd")
.ToList();
var userList4 = db.Set<T_UserInfor>().FromSql($"select * from T_UserInfor")
.Where(u => u.id != "")
.OrderBy(u => u.addTime)
.ToList();
//4.利用SqlParameter进行参数化查询
SqlParameter[] paras ={
new SqlParameter("@id","2fc343069e0a4a559b62b08d5999dbcd"),
new SqlParameter("@userName","ypf"),
};
var userList5 = db.Set<T_UserInfor>().FromSql("select * from T_UserInfor where id=@id and userName=@userName", paras).ToList();
}
}
3.调用存储过程的几种情况
可以利用SqlParameter传递参数,防止sql注入。
A.不含任何参数
B.含多个输入参数
C.含输入参数和输出参数
用到的表结构:

对应的生成存储过程的代码:
USE [EFDB01] --事先准备:插入两条数据
select * from T_UserInfor
truncate table T_UserInfor
insert into T_UserInfor values('','ypf','男',12,'2019-08-08')
insert into T_UserInfor values('','ypf2','女',30,'2019-09-08') -- 1. 不含任何参数存储过程
if (exists (select * from sys.objects where name = 'GetAll'))
drop proc GetAll
go
create proc GetAll
as
select * from T_UserInfor; -- 调用
exec GetAll; --2. 含多个输入参数的存储过程
if (exists (select * from sys.objects where name = 'GetALLBy'))
drop proc GetALLBy
go
create proc GetALLBy(
@id varchar(32),
@userName varchar(20)
)
as
select * from T_UserInfor where id=@id and userName=@userName; exec GetALLBy @id='',@userName='ypf'; --3. 含输出参数的存储过程
if (exists (select * from sys.objects where name = 'GetSpecial'))
drop proc GetSpecial
go
create proc GetSpecial(
@userName varchar(32),
@count int output
)
as
select @count=count(*) from T_UserInfor;
select * from T_UserInfor where userName= @userName; go
declare @myCount int;
exec GetSpecial 'ypf',@myCount output;
select @myCount as myCount;
对应EF调用的代码:(2.x的写法)
{
using (EFDB01Context db = new EFDB01Context())
{
//1. 不含任何参数存储过程
var data1 = db.Set<T_UserInfor>().FromSql("GetAll").ToList();
//2. 含多个输入参数的存储过程
SqlParameter[] para ={
new SqlParameter("@id",""),
new SqlParameter("@userName","ypf")
};
var data2 = db.Set<T_UserInfor>().FromSql("GetALLBy @id,@userName", para).ToList();
//3. 带输出参数的存储过程
//把输出参数单独拿出来声明
SqlParameter myCount = new SqlParameter("@count", SqlDbType.Int);
myCount.Direction = ParameterDirection.Output;
//把输出参数放到数组里
SqlParameter[] para2 ={
new SqlParameter("@userName","ypf"),
myCount
};
var data3 = db.Set<T_UserInfor>().FromSql("exec GetSpecial @userName,@count out", para2).ToList();
//通过输出参数在数组中的位置来获取返回值。
var count = para2[].Value;
}
}
二. 其它类
EFCore2.x中用 ExecuteSqlCommand 方法,EFCore3.x中用 ExecuteSqlRaw 方法,二者使用起来基本一致。
1.说明
主要用于调用除了查询外其它的SQL语句。
2.调用SQL语句的情况
A. 基本的原生SQL查询
B. 利用$内插语法进行传递
C. 利用SqlParameter进行参数化查询
代码分享:(2.x的写法)
{
using (EFDB01Context db = new EFDB01Context())
{
//1.增加
int result1 = db.Database.ExecuteSqlCommand("insert into T_UserInfor values('01','test1','男',21,'2019-09-09')");
//2. 修改
SqlParameter[] paras ={
new SqlParameter("@id",""),
new SqlParameter("@userSex","未知"),
};
int result2 = db.Database.ExecuteSqlCommand("update T_UserInfor set userSex=@userSex where id=@id", paras);
//3. 删除
var myId = "";
int result3 = db.Database.ExecuteSqlCommand($"delete from T_UserInfor where id={myId}");
//4. 其它指令
int result4 = db.Database.ExecuteSqlCommand("truncate table T_UserInfor");
}
}
3.调用存储过程的情况
存储过程代码
--4. 非查询类的存储过程
if (exists (select * from sys.objects where name = 'DoSome'))
drop proc DoSome
go
create proc DoSome(
@id varchar(32)
)
as
begin transaction
begin try
insert into T_UserInfor values(@id,'ypf','男',12,'2019-08-08');
delete from T_UserInfor where id=''
commit transaction
end try
begin catch
rollback transaction
end catch exec DoSome ''
EF的调用代码 (2.x的写法)
{
using (EFDB01Context db = new EFDB01Context())
{
SqlParameter[] para ={
new SqlParameter("@id",Guid.NewGuid().ToString("N")),
};
int n = db.Database.ExecuteSqlCommand("DoSome @id", para);
if (n > )
{
Console.WriteLine("操作成功");
}
else
{
Console.WriteLine("没有更多数据进行处理");
}
}
}
!
- 作 者 : Yaopengfei(姚鹏飞)
- 博客地址 : http://www.cnblogs.com/yaopengfei/
- 声 明1 : 本人才疏学浅,用郭德纲的话说“我是一个小学生”,如有错误,欢迎讨论,请勿谩骂^_^。
- 声 明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
第七节:EF Core调用SQL语句和存储过程的更多相关文章
- EF Core 执行SQL语句和存储过程
无论ORM有多么强大,总会出现一些特殊的情况,它无法满足我们的要求.在这篇文章中,我们介绍几种执行SQL的方法. 表结构 在具体内容开始之前,我们先简单说明一下要使用的表结构. public clas ...
- easyui datagrid 禁止选中行 EF的增删改查(转载) C# 获取用户IP地址(转载) MVC EF 执行SQL语句(转载) 在EF中执行SQL语句(转载) EF中使用SQL语句或存储过程 .net MVC使用Session验证用户登录 PowerDesigner 参照完整性约束(转载)
easyui datagrid 禁止选中行 没有找到可以直接禁止的属性,但是找到两个间接禁止的方式. 方式一: //onClickRow: function (rowIndex, rowData) ...
- EF中使用SQL语句或存储过程
EF中使用SQL语句或存储过程 1.无参数查询var model = db.Database.SqlQuery<UserInfo>("select* from UserInfoe ...
- Entity Framework Core 执行SQL语句和存储过程
无论ORM有多么强大,总会出现一些特殊的情况,它无法满足我们的要求.在这篇文章中,我们介绍几种执行SQL的方法. 表结构 在具体内容开始之前,我们先简单说明一下要使用的表结构. public clas ...
- EF中使用SQL语句或存储过程(小笔记)
1.无参数查询 var model = db.Database.SqlQuery<UserInfo>("select* from UserInfoes ").ToLis ...
- EF Core使用SQL调用返回其他类型的查询 ASP.NET Core 2.0 使用NLog实现日志记录 CSS 3D transforms cSharp:use Activator.CreateInstance with an Interface? SqlHelper DBHelper C# Thread.Abort方法真的让线程停止了吗? 注意!你的Thread.Abort方法真
EF Core使用SQL调用返回其他类型的查询 假设你想要 SQL 本身编写,而不使用 LINQ. 需要运行 SQL 查询中返回实体对象之外的内容. 在 EF Core 中,执行该操作的另一种方法 ...
- 如何用VS EF连接 Mysql,以及执行SQL语句 和存储过程?
VS2013, MySQL5.7.18 , MySQL5.7.14 执行SQL语句: ztp_user z = new ztp_user(); object[] obj = new object[] ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(89)-EF执行SQL语句与存储过程
这一节,我们来看看EF如何执行SQL语句与读取存储过程的数据,可能有一部分人,还不知道EF如何执行存储过程与原生SQL语句! 我们什么时候要直接使用原生的SQL语句? 返回值过于复杂 过于复杂的联合查 ...
- EF中执行sql语句,以及事务
EF to sql string sql = "select T_Task.BSID,T_Task.CloseDate,T_Task.CompleteDate,T_Task.CloseUse ...
随机推荐
- Linux磁盘系统——磁盘系统简介
Linux磁盘系统——磁盘系统简介 摘要:本文主要学习了Linux系统中有关磁盘的一些知识. 文件系统 说明 硬盘是用来存储数据的,可以将其想象成柜子,只不过柜子是用来存储衣物的.新买来的硬盘,通常要 ...
- unlink remove
int unlink(const char *pathname); 删除一个文件的目录项并减少它的链接数 unlink()会删除参数pathname指定的文件.如果该文件名为最后连接点,但有其他进程打 ...
- vue学习指南:第九篇(详细) - Vue的 Slot-插槽
Slot v-slot 插槽元素 浏览器在解析时候首先把它当作标签来解析,只有遇到不认识的就不管了,直接跳过,当你发现是组件,在以组件形式解析. 使用插槽的好处? 比如一个网站 分布顶部都是一样的, ...
- Fundebug后端Node.js插件更新至0.2.0,支持监控Express慢请求
摘要: 性能问题也是BUG,也需要监控. Fundebug后端Node.js异常监控服务 Fundebug是专业的应用异常监控平台,我们Node.js插件fundebug-nodejs可以提供全方位的 ...
- centos安装elasticsearch-rtf5.5.4
安装jdk 我的博文里面有 https://www.cnblogs.com/vinic-xxm/p/11825691.html 安装elasticsearch-rtf git clone git:// ...
- python之便携式mysql类和tornado mysql长链接
mymysql.py class MyMysql2(object): def __init__(self, host = '', user = '', passwd = '', db = '', po ...
- I2C 挂死,SDA一直为低问题分析【转】
转自:https://blog.csdn.net/winitz/article/details/72460775 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csd ...
- vue-router有哪几种导航钩子 keep-alive的详细用法 解决跨域
1===>vue-router有哪几种导航钩子? 第一种:是全局导航钩子:router.beforeEach(to,from,next) 第二 ...
- 07webpack--下载对应的css模块
<!--本节 loader配置处理css样式 在src下新建css文件夹 在css下创建index.css 在main.js这个入口文件中 引入js模块 和 css杨思表是不同的 在main.j ...
- 【餐厅】 What kind of food would you like to eat tonight?
核心句型 What kind of food would you like to eat tonight? 你今晚想吃哪种菜? What would you like to eat ? 你想吃什么? ...