一. 查询类

  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版本的写法)

  1. {
  2. using (EFDB01Context db = new EFDB01Context())
  3. {
  4. //1.基本的原生SQL查询
  5. var userList1 = db.Set<T_UserInfor>().FromSql("select * from T_UserInfor where id!='123'").ToList();
  6.  
  7. //2.利用$内插语法进行传递
  8. var myId = "2fc343069e0a4a559b62b08d5999dbcd";
  9. var userList2 = db.Set<T_UserInfor>().FromSql($"select * from T_UserInfor where id= {myId}").ToList();
  10.  
  11. //3.原生SQL与linq语法相结合
  12. var userList3 = db.Set<T_UserInfor>().FromSql($"select * from T_UserInfor")
  13. .Where(u => u.id == "2fc343069e0a4a559b62b08d5999dbcd")
  14. .ToList();
  15. var userList4 = db.Set<T_UserInfor>().FromSql($"select * from T_UserInfor")
  16. .Where(u => u.id != "")
  17. .OrderBy(u => u.addTime)
  18. .ToList();
  19.  
  20. //4.利用SqlParameter进行参数化查询
  21. SqlParameter[] paras ={
  22. new SqlParameter("@id","2fc343069e0a4a559b62b08d5999dbcd"),
  23. new SqlParameter("@userName","ypf"),
  24. };
  25. var userList5 = db.Set<T_UserInfor>().FromSql("select * from T_UserInfor where id=@id and userName=@userName", paras).ToList();
  26. }
  27. }

3.调用存储过程的几种情况

  可以利用SqlParameter传递参数,防止sql注入。

  A.不含任何参数

  B.含多个输入参数

  C.含输入参数和输出参数

用到的表结构:

对应的生成存储过程的代码:

  1. USE [EFDB01]
  2.  
  3. --事先准备:插入两条数据
  4. select * from T_UserInfor
  5. truncate table T_UserInfor
  6. insert into T_UserInfor values('','ypf','男',12,'2019-08-08')
  7. insert into T_UserInfor values('','ypf2','女',30,'2019-09-08')
  8.  
  9. -- 1. 不含任何参数存储过程
  10. if (exists (select * from sys.objects where name = 'GetAll'))
  11. drop proc GetAll
  12. go
  13. create proc GetAll
  14. as
  15. select * from T_UserInfor;
  16.  
  17. -- 调用
  18. exec GetAll;
  19.  
  20. --2. 含多个输入参数的存储过程
  21. if (exists (select * from sys.objects where name = 'GetALLBy'))
  22. drop proc GetALLBy
  23. go
  24. create proc GetALLBy(
  25. @id varchar(32),
  26. @userName varchar(20)
  27. )
  28. as
  29. select * from T_UserInfor where id=@id and userName=@userName;
  30.  
  31. exec GetALLBy @id='',@userName='ypf';
  32.  
  33. --3. 含输出参数的存储过程
  34. if (exists (select * from sys.objects where name = 'GetSpecial'))
  35. drop proc GetSpecial
  36. go
  37. create proc GetSpecial(
  38. @userName varchar(32),
  39. @count int output
  40. )
  41. as
  42. select @count=count(*) from T_UserInfor;
  43. select * from T_UserInfor where userName= @userName;
  44.  
  45. go
  46. declare @myCount int;
  47. exec GetSpecial 'ypf',@myCount output;
  48. select @myCount as myCount;

对应EF调用的代码:(2.x的写法)

  1. {
  2. using (EFDB01Context db = new EFDB01Context())
  3. {
  4. //1. 不含任何参数存储过程
  5. var data1 = db.Set<T_UserInfor>().FromSql("GetAll").ToList();
  6.  
  7. //2. 含多个输入参数的存储过程
  8. SqlParameter[] para ={
  9. new SqlParameter("@id",""),
  10. new SqlParameter("@userName","ypf")
  11. };
  12. var data2 = db.Set<T_UserInfor>().FromSql("GetALLBy @id,@userName", para).ToList();
  13.  
  14. //3. 带输出参数的存储过程
  15. //把输出参数单独拿出来声明
  16. SqlParameter myCount = new SqlParameter("@count", SqlDbType.Int);
  17. myCount.Direction = ParameterDirection.Output;
  18. //把输出参数放到数组里
  19. SqlParameter[] para2 ={
  20. new SqlParameter("@userName","ypf"),
  21. myCount
  22. };
  23. var data3 = db.Set<T_UserInfor>().FromSql("exec GetSpecial @userName,@count out", para2).ToList();
  24. //通过输出参数在数组中的位置来获取返回值。
  25. var count = para2[].Value;
  26.  
  27. }
  28. }

二. 其它类

  EFCore2.x中用 ExecuteSqlCommand 方法,EFCore3.x中用 ExecuteSqlRaw 方法,二者使用起来基本一致。

1.说明

  主要用于调用除了查询外其它的SQL语句。

2.调用SQL语句的情况

  A. 基本的原生SQL查询

  B. 利用$内插语法进行传递

  C. 利用SqlParameter进行参数化查询

代码分享:(2.x的写法)

  1. {
  2. using (EFDB01Context db = new EFDB01Context())
  3. {
  4.  
  5. //1.增加
  6. int result1 = db.Database.ExecuteSqlCommand("insert into T_UserInfor values('01','test1','男',21,'2019-09-09')");
  7.  
  8. //2. 修改
  9. SqlParameter[] paras ={
  10. new SqlParameter("@id",""),
  11. new SqlParameter("@userSex","未知"),
  12. };
  13. int result2 = db.Database.ExecuteSqlCommand("update T_UserInfor set userSex=@userSex where id=@id", paras);
  14.  
  15. //3. 删除
  16. var myId = "";
  17. int result3 = db.Database.ExecuteSqlCommand($"delete from T_UserInfor where id={myId}");
  18.  
  19. //4. 其它指令
  20. int result4 = db.Database.ExecuteSqlCommand("truncate table T_UserInfor");
  21. }
  22. }

3.调用存储过程的情况

存储过程代码

  1. --4. 非查询类的存储过程
  2. if (exists (select * from sys.objects where name = 'DoSome'))
  3. drop proc DoSome
  4. go
  5. create proc DoSome(
  6. @id varchar(32)
  7. )
  8. as
  9. begin transaction
  10. begin try
  11. insert into T_UserInfor values(@id,'ypf','男',12,'2019-08-08');
  12. delete from T_UserInfor where id=''
  13. commit transaction
  14. end try
  15. begin catch
  16. rollback transaction
  17. end catch
  18.  
  19. exec DoSome ''

EF的调用代码 (2.x的写法)

  1. {
  2. using (EFDB01Context db = new EFDB01Context())
  3. {
  4. SqlParameter[] para ={
  5. new SqlParameter("@id",Guid.NewGuid().ToString("N")),
  6. };
  7. int n = db.Database.ExecuteSqlCommand("DoSome @id", para);
  8. if (n > )
  9. {
  10. Console.WriteLine("操作成功");
  11. }
  12. else
  13. {
  14. Console.WriteLine("没有更多数据进行处理");
  15. }
  16. }
  17. }

!

  • 作       者 : Yaopengfei(姚鹏飞)
  • 博客地址 : http://www.cnblogs.com/yaopengfei/
  • 声     明1 : 本人才疏学浅,用郭德纲的话说“我是一个小学生”,如有错误,欢迎讨论,请勿谩骂^_^。
  • 声     明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
 

第七节:EF Core调用SQL语句和存储过程的更多相关文章

  1. EF Core 执行SQL语句和存储过程

    无论ORM有多么强大,总会出现一些特殊的情况,它无法满足我们的要求.在这篇文章中,我们介绍几种执行SQL的方法. 表结构 在具体内容开始之前,我们先简单说明一下要使用的表结构. public clas ...

  2. easyui datagrid 禁止选中行 EF的增删改查(转载) C# 获取用户IP地址(转载) MVC EF 执行SQL语句(转载) 在EF中执行SQL语句(转载) EF中使用SQL语句或存储过程 .net MVC使用Session验证用户登录 PowerDesigner 参照完整性约束(转载)

    easyui datagrid 禁止选中行   没有找到可以直接禁止的属性,但是找到两个间接禁止的方式. 方式一: //onClickRow: function (rowIndex, rowData) ...

  3. EF中使用SQL语句或存储过程

    EF中使用SQL语句或存储过程 1.无参数查询var model = db.Database.SqlQuery<UserInfo>("select* from UserInfoe ...

  4. Entity Framework Core 执行SQL语句和存储过程

    无论ORM有多么强大,总会出现一些特殊的情况,它无法满足我们的要求.在这篇文章中,我们介绍几种执行SQL的方法. 表结构 在具体内容开始之前,我们先简单说明一下要使用的表结构. public clas ...

  5. EF中使用SQL语句或存储过程(小笔记)

    1.无参数查询 var model = db.Database.SqlQuery<UserInfo>("select* from UserInfoes ").ToLis ...

  6. 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 中,执行该操作的另一种方法 ...

  7. 如何用VS EF连接 Mysql,以及执行SQL语句 和存储过程?

    VS2013, MySQL5.7.18 , MySQL5.7.14 执行SQL语句: ztp_user z = new ztp_user(); object[] obj = new object[] ...

  8. ASP.NET MVC5+EF6+EasyUI 后台管理系统(89)-EF执行SQL语句与存储过程

    这一节,我们来看看EF如何执行SQL语句与读取存储过程的数据,可能有一部分人,还不知道EF如何执行存储过程与原生SQL语句! 我们什么时候要直接使用原生的SQL语句? 返回值过于复杂 过于复杂的联合查 ...

  9. EF中执行sql语句,以及事务

    EF to sql string sql = "select T_Task.BSID,T_Task.CloseDate,T_Task.CompleteDate,T_Task.CloseUse ...

随机推荐

  1. PHP工作岗位要求

    初级PHP 企业对初级PHP的要求是,在日常工作中,保证编码质量,对一般问题具有解决能力. 1.团队合作:经常是Git或者SVN.主要是为了能够融入敏捷开发团队2.前端:HTML.CSS.JS要精通. ...

  2. 百度云BCC安装WordPress镜像

    重装系统 在BCC实例中,重装系统选择WordPress. Centos 6.5 x64Apache 2.2.15: Web 主目录:/home/www/default 配置文件目录:/etc/htt ...

  3. EntityFramework优化:SQL语句日志

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Te ...

  4. jQuery-对列表的操作

    主要是通过对dom元素的增加和删除实现对数据增加和删除 <!DOCTYPE html> <html lang="en"> <head> < ...

  5. ucoreOS_lab1 实验报告

    由于我个人不太懂 AT&T 语法,在完成实验的过程中遇到了相当大的阻碍,甚至有点怀疑人生,我是否心太大了,妄想在短时间内学懂大清的课程.ucoreOS_lab1 这个实验前前后后做到了现在才勉 ...

  6. 用for循环数组去重

    <script> var arr=["a","e","w","f","a"," ...

  7. URL 路由系统 + views 函数

    一.URL URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于这个URL调用这段 ...

  8. win10企业版LTSC批量激活

    slmgr -ipk M7XTQ-FN8P6-TTKYV-9D4CC-J462D   slmgr -skms kms.03k.org slmgr -ato slmgr -dlv

  9. LOJ 546: 「LibreOJ β Round #7」网格图

    题目传送门:LOJ #546. 题意简述: 题目说的很清楚了. 题解: 将不包含起点或障碍物的连续的行或列缩成一行或一列,不会影响答案. 处理过后,新的网格图的行数和列数最多为 \(2k + 3\). ...

  10. E09【餐厅】Can I have the bill,please?

    核心句型: Can I have the bill ,please? 请给我账单,好吗? 场景对话: A:Excuse me. Can I have the bill ,please? 你好,请给我账 ...