第七节: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 ...
随机推荐
- PHP工作岗位要求
初级PHP 企业对初级PHP的要求是,在日常工作中,保证编码质量,对一般问题具有解决能力. 1.团队合作:经常是Git或者SVN.主要是为了能够融入敏捷开发团队2.前端:HTML.CSS.JS要精通. ...
- 百度云BCC安装WordPress镜像
重装系统 在BCC实例中,重装系统选择WordPress. Centos 6.5 x64Apache 2.2.15: Web 主目录:/home/www/default 配置文件目录:/etc/htt ...
- EntityFramework优化:SQL语句日志
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Te ...
- jQuery-对列表的操作
主要是通过对dom元素的增加和删除实现对数据增加和删除 <!DOCTYPE html> <html lang="en"> <head> < ...
- ucoreOS_lab1 实验报告
由于我个人不太懂 AT&T 语法,在完成实验的过程中遇到了相当大的阻碍,甚至有点怀疑人生,我是否心太大了,妄想在短时间内学懂大清的课程.ucoreOS_lab1 这个实验前前后后做到了现在才勉 ...
- 用for循环数组去重
<script> var arr=["a","e","w","f","a"," ...
- URL 路由系统 + views 函数
一.URL URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于这个URL调用这段 ...
- win10企业版LTSC批量激活
slmgr -ipk M7XTQ-FN8P6-TTKYV-9D4CC-J462D slmgr -skms kms.03k.org slmgr -ato slmgr -dlv
- LOJ 546: 「LibreOJ β Round #7」网格图
题目传送门:LOJ #546. 题意简述: 题目说的很清楚了. 题解: 将不包含起点或障碍物的连续的行或列缩成一行或一列,不会影响答案. 处理过后,新的网格图的行数和列数最多为 \(2k + 3\). ...
- E09【餐厅】Can I have the bill,please?
核心句型: Can I have the bill ,please? 请给我账单,好吗? 场景对话: A:Excuse me. Can I have the bill ,please? 你好,请给我账 ...