一. 查询类

  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语句和存储过程的更多相关文章

  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. flux架构的详细介绍和使用!

    结构分为四个 视图 view动作 action派发器 dispatcher数据商店 store 流程: 用户操作视图 视图(view)发送动作(action)到派发器(dispatcher) 由派发器 ...

  2. php取整的几种方式,四舍五入,舍去法取整,进一法取整

    php取整的几种方式,四舍五入,舍去法取整,进一法取整方式一:round 对浮点数进行四舍五入语法:float round ( float val [, int precision] ) echo r ...

  3. nodejs块级作用域

    现在让我们了解3个关键字var.let.const,的特性和使用方法. var JavaScript中,我们通常说的作用域是函数作用域,使用var声明的变量,无论是在代码的哪个地方声明的,都会提升到当 ...

  4. Gradle 创建java程序详细步骤

    Java构建工具三强: Ant, Maven, GradleAnt历史悠久, 用build.xml 描述, 当时他的xml着实让很多工程师头痛, 但仍有用武之地. Maven 用pom.xml 文件描 ...

  5. 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 ...

  6. lua 的 cjson 安装,使用

    1. 背景: 虚拟机安装的luajit  没有 cjson 库,就不能对 table 进行 编码操作,手动安装一个. 2. 安装: cjson下载地址:http://www.kyne.com.au/~ ...

  7. 2-1Numpy概述

    In [1]: import numpy as np In [2]: array=[1,2,3,4,5] array+1#没定义成numpy.ndarray类型是不能直接操作的   --------- ...

  8. 不设置readable,读取图片数据

    直接加载非Readable的Texture,是不能访问其像素数据的: // 加载 var tex = AssetDatabase.LoadAssetAtPath<Texture2D>(as ...

  9. 201871010128-杨丽霞《面向对象程序设计(java)》第十五周学习总结

    201871010128-杨丽霞<面向对象程序设计(java)>第十五周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...

  10. springboot整合邮件

    一.邮件相关知识补充 SMTP(Simple Mail Transfer Protocol) 即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式.SMTP协议属 ...