第七节: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 ...
随机推荐
- flux架构的详细介绍和使用!
结构分为四个 视图 view动作 action派发器 dispatcher数据商店 store 流程: 用户操作视图 视图(view)发送动作(action)到派发器(dispatcher) 由派发器 ...
- php取整的几种方式,四舍五入,舍去法取整,进一法取整
php取整的几种方式,四舍五入,舍去法取整,进一法取整方式一:round 对浮点数进行四舍五入语法:float round ( float val [, int precision] ) echo r ...
- nodejs块级作用域
现在让我们了解3个关键字var.let.const,的特性和使用方法. var JavaScript中,我们通常说的作用域是函数作用域,使用var声明的变量,无论是在代码的哪个地方声明的,都会提升到当 ...
- Gradle 创建java程序详细步骤
Java构建工具三强: Ant, Maven, GradleAnt历史悠久, 用build.xml 描述, 当时他的xml着实让很多工程师头痛, 但仍有用武之地. Maven 用pom.xml 文件描 ...
- springboot测试启动报错java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) with your test
springboot测试启动报错: java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you ne ...
- lua 的 cjson 安装,使用
1. 背景: 虚拟机安装的luajit 没有 cjson 库,就不能对 table 进行 编码操作,手动安装一个. 2. 安装: cjson下载地址:http://www.kyne.com.au/~ ...
- 2-1Numpy概述
In [1]: import numpy as np In [2]: array=[1,2,3,4,5] array+1#没定义成numpy.ndarray类型是不能直接操作的 --------- ...
- 不设置readable,读取图片数据
直接加载非Readable的Texture,是不能访问其像素数据的: // 加载 var tex = AssetDatabase.LoadAssetAtPath<Texture2D>(as ...
- 201871010128-杨丽霞《面向对象程序设计(java)》第十五周学习总结
201871010128-杨丽霞<面向对象程序设计(java)>第十五周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...
- springboot整合邮件
一.邮件相关知识补充 SMTP(Simple Mail Transfer Protocol) 即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式.SMTP协议属 ...