一. 查询类(FromSql)

1.说明

  A. SQL查询必须返回实体的所有属性字段。

  B. 结果集中的列名必须与属性映射到的列名相匹配。

  C. SQL查询不能包含关联数据

  D. 除Select以为的其它SQL语句无法运行。

2.调用SQL语句的几种情况

  A. 基本的原生SQL查询

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

  C. 原生SQL与linq语法相结合

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

代码分享:

 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 != "1111")
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('01','ypf','男',12,'2019-08-08')
 7 insert into T_UserInfor values('02','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
21 --2. 含多个输入参数的存储过程
22 if (exists (select * from sys.objects where name = 'GetALLBy'))
23     drop proc GetALLBy
24 go
25     create proc GetALLBy(
26         @id varchar(32),
27         @userName varchar(20)
28     )
29 as
30     select * from T_UserInfor where id=@id and userName=@userName;
31
32 exec GetALLBy @id='01',@userName='ypf';
33
34 --3. 含输出参数的存储过程
35  if (exists (select * from sys.objects where name = 'GetSpecial'))
36     drop proc GetSpecial
37 go
38     create proc GetSpecial(
39         @userName varchar(32),
40         @count int output
41     )
42 as
43     select @count=count(*) from T_UserInfor;
44     select * from T_UserInfor where userName= @userName;
45
46 go
47 declare @myCount int;
48 exec GetSpecial 'ypf',@myCount output;
49 select @myCount as myCount;

对应EF调用的代码:

 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","01"),
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[1].Value;
26
27                 }
28             }

二. 其它类(ExecuteSqlCommand)

1.说明

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

2.调用SQL语句的情况

  A. 基本的原生SQL查询

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

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

代码分享:

 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","01"),
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 = "01";
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.调用存储过程的情况

存储过程代码

--4. 非查询类的存储过程
if (exists (select * from sys.objects where name = 'DoSome'))drop proc DoSome
go create proc DoSome(@id varchar(32))
asbegin transactionbegin tryinsert into T_UserInfor values(@id,'ypf','男',12,'2019-08-08');delete from T_UserInfor where id='02'commit transactionend trybegin catchrollback transactionend catchexec DoSome '03'

EF的调用代码

 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 > 0)
 9                     {
10                         Console.WriteLine("操作成功");
11                     }
12                     else
13                     {
14                         Console.WriteLine("没有更多数据进行处理");
15                     }
16                 }
17             }

!

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

转载于:https://www.cnblogs.com/yaopengfei/p/11459170.html

第七节:EF Core调用SQL语句和存储过程相关推荐

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

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

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

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

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

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

  4. 第七节: EF的三种事务的应用场景和各自注意的问题(SaveChanges、DBContextTransaction、TransactionScope)

    一. 什么是事务 我们通俗的理解事务就是一系列操作要么全部成功.要么全部失败(不可能存在部分成功,部分失败的情况). 举一个事务在我们日常生活中的经典例子:两张银行卡(甲.乙),甲向乙转钱,整个过程需 ...

  5. ef 执行mysql语句_在EF中执行SQL语句

    一.为什么要在EF中执行SQL语句 使用EF操作数据库,可以避免写SQL语句,完成使用Linq实现,但为什么还要在EF中执行SQL语句呢.如果要写SQL语句,完全可以使用ADO.NET来操作数据库.这 ...

  6. 用于存储过程的ASP.NET Core Blazor和EF Core原始SQL查询

    目录 介绍 背景 先决条件 使用代码 创建数据库和表 步骤1:创建ASP.NET Core Blazor服务器应用程序 运行测试应用程序 步骤2:安装软件包 连接字符串 步骤3:建立模型类 创建DBC ...

  7. 在EF中执行SQL语句

    一.为什么要在EF中执行SQL语句   使用EF操作数据库,可以避免写SQL语句,完成使用Linq实现,但为什么还要在EF中执行SQL语句呢.如果要写SQL语句,完全可以使用ADO.NET来操作数据库 ...

  8. dede调用sql语句的方法

    这篇文章给大家分享的是有关dede调用sql语句的方法的内容.小编觉得挺实用的,因此分享给大家做个参考.一起跟随小编过来看看吧.  dede的sql语句怎么调用?  sql语句调用,在一些特殊情况下还 ...

  9. Java学习的第七周之简单的SQL语句

    Java学习的第七周之简单的SQL语句 一 简单SQL语句: 1.查询表结构 desc 表名; 2.插入数据 --方式一: 默认全部插入数据INSERT INTO 表名 VALUES (值1,值2,值 ...

最新文章

  1. python函数每日一讲 - cmp(x,y)
  2. 前端学习(1395):多人管理项目15建立请求
  3. python三维模型_python三维模型
  4. 基于Opencv--图像上采样
  5. Unreal Engine 4添加自定义Settings到项目设置
  6. iptables转发基础
  7. linux内核分析与应用 -- 内存管理(上)
  8. Linux libaio 实例,linux libaio安装
  9. MBR分区表详解(SD卡)
  10. 元宇宙大杀器来了!小扎祭出4款VR头显,挑战视觉图灵测试
  11. 为公寓运营商提供SaaS管理系统,寓小二获贝壳找房5000万元A轮融资...
  12. 推荐:(链接)幽默男女--绝对搞笑!!(每日更新)
  13. win7上安装DDK,SDK。。
  14. ASPX页面AJAX调用ASPX后台
  15. manjaro双系统 windows_manjaro win10双系统安装
  16. android触摸震动原理
  17. 【正点原子Linux连载】第五章 文件属性与目录-摘自【正点原子】I.MX6U嵌入式Linux C应用编程指南V1.1
  18. POST和GET有什么区别?
  19. 郝斌老师-C语言视频教程(全180讲)
  20. 服务器里怎么设置微信多开,私域必备,企业微信多开的4种方法

热门文章

  1. React.js开发生态系统概览 [译-转]
  2. tableau使用_使用Tableau探索墨尔本房地产市场
  3. 干货 | Elasticsearch7.X Scripting脚本使用详解
  4. “去除更多的鲜艳色彩和动态效果的搭配,精简用户使用步长,让软件更像是一件工具。(不排除以后更先进的吸引眼球的方式)“。
  5. 小论文期刊投稿相关整理资料
  6. TFT显示屏驱动设计与验证
  7. VC,一条会被鼠标移动的直线
  8. python通过链接下载文件-如何使用Python通过HTTP下载文件?
  9. php调用md5.js,PHP和JS实现HTTP上安全地传输密码
  10. 同一个网络中为什么有些计算机可以连接共享打印机,有些需要输入密码,安装局域网共享打印机时,要求输入用户和密码,但对方并没有设置,为什么?谢谢!!...