一. 查询类

  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. 新手入门必看:VectorDraw 常见问题整理大全(一)

    VectorDraw Developer Framework(VDF)是一个用于应用程序可视化的图形引擎库.有了VDF提供的功能,您可以轻松地创建.编辑.管理.输出.输入和打印2D和3D图形文件.该库 ...

  2. curl sftp libcurl 功能使用

    #include <curl/curl.h> #undef DISABLE_SSH_AGENT struct FtpFile { const char *filename; FILE *s ...

  3. Linux下对input设备调用ioctl时指定EVIOCGBIT选项时的缓冲区该多大【转】

    转自:https://blog.csdn.net/imred/article/details/82669990 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出 ...

  4. Python3字典排序

    创建一个字典 dict1={'a':2,'b':3,'c':8,'d':4} 1.分别取键.值 取字典的所有键,所有的值,利用dict1.keys(),dict1.vaules(), 由于键,值有很多 ...

  5. 03导航链接的制作(wx:for循环)和小程序警告request fail url not in domain list

    06==>导航链接的制作 <!-- 导航链接 --> <navigator url="../list/list" hover-class="nav ...

  6. JS高阶---函数

    [问题] [主体] 1.什么是函数? ①实现特定功能 ②多条语句的封装体 ③可以重复执行的代码块 2.为什么用函数? 提高代码的复用性,提升效率 3.如何定义函数? ①函数声明定义 ②函数表达式定义③ ...

  7. docker 部署appium

    1.docker appium镜像和命令:https://github.com/appium/appium-docker-android 2.启动appium docker run --privile ...

  8. Lp距离, L1范数, 和L2范数(转载)

    范式可以理解成距离 转载自: https://blog.csdn.net/hanhuili/article/details/52079590 内容如下: 由此可见,L2其实就是欧式距离.工程上,往往不 ...

  9. JetBrains优惠码分享

    A quick summary [feel free to pass it on to your team]: Your Promo code is: S2W69-N3VY3-YGACY-7WC7X- ...

  10. numpy cookbook

    1.第一章 import numpy as np import matplotlib.pyplot as plt import scipy import PIL import scipy.misc l ...