Entity Framework Core 执行SQL语句和存储过程
无论ORM有多么强大,总会出现一些特殊的情况,它无法满足我们的要求。在这篇文章中,我们介绍几种执行SQL的方法。
表结构
在具体内容开始之前,我们先简单说明一下要使用的表结构。
public class Category
{
public int CategoryID { get; set; }
public string CategoryName { get; set; }
}
在Category
定义了两个字段:CategoryID
、CategoryName
。
public class SampleDbContext : DbContext
{
public virtual DbSet<Category> Categories { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
var sqlConnectionStringBuilder = new SqlConnectionStringBuilder {
DataSource = "10.0.1.5",
InitialCatalog = "TestDataBase",
UserID = "sa",
Password = "******"
};
optionsBuilder.UseSqlServer(sqlConnectionStringBuilder.ConnectionString);
base.OnConfiguring(optionsBuilder);
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
EntityTypeBuilder<Category> entityTypeBuilder = modelBuilder.Entity<Category>();
entityTypeBuilder.ToTable("Category");
entityTypeBuilder.HasKey(e => e.CategoryID);
entityTypeBuilder.Property(e => e.CategoryID).UseSqlServerIdentityColumn();
}
}
我们使用SampleDbContext
来访问数据库。
FromSql执行SQL语句
Entity Framework Core为DbSet<TEntity>
提供了一个扩展方法FromSql
,用于执行SQL语句或存储过程,以下示例使用FromSql
加载所有的数据。
using (var dataContext = new SampleDbContext()) {
var query = dataContext.Categories.FromSql("select * from Category");
var result = query.ToList();
}
对于带有参数的SQL语句,我们使用C# 6 语法将SQL写成如下:
using (var dataContext = new SampleDbContext()) {
var categoryID = 1;
var query = dataContext.Categories.FromSql($"select * from Category where CategoryID={categoryID}");
var result = query.ToList();
}
注意:这里不是直接使用拼接的方式处理SQL,而是转化为参数化的SQL语句,这有助于防止SQL注入攻击。我们可以使用SQL Server Profiler帮我们验证:
exec sp_executesql N'select * from Category where CategoryID=@p0
',N'@p0 int',@p0=1
如果您不使用C# 6的语法特征,我们必须使用 @p0、@p1 ... @pn 做为SQL语句的参数:
using (var dataContext = new SampleDbContext()) {
var categoryID = 1;
var categoryName = "Product";
var query = dataContext.Categories.FromSql("select * from Category where CategoryID=@p0 and CategoryName=@p1"
categoryID, categoryName);
var result = query.ToList();
Assert.NotNull(result);
}
在上述SQL语句中中,将@p0
映射到categoryID
、@ p1
映射到categoryName
。
FromSql
扩展方法返回的是IQueryable<TEntity>
对象,要们还可以接着使用一些Linq的方法,示例如下:
using (var dataContext = new SampleDbContext()) {
var categoryID = 1;
var query = dataContext.Categories.FromSql("select * from Category")
.Where(item => item.CategoryID == categoryID)
.OrderBy(item => item.CategoryName);
var result = query.ToList();
}
不过在这里,使用的是子查询,使用SQL Server Profiler捕获到的SQL语句如下:
exec sp_executesql N'SELECT [item].[CategoryID], [item].[CategoryName]
FROM (
select * from Category
) AS [item]
WHERE [item].[CategoryID] = @__categoryID_1
ORDER BY [item].[CategoryName]',N'@__categoryID_1 int',@__categoryID_1=1
提示:使用
FromSql
时,需要在执行的SQL语句中返回所有列,并且列名必须与实体属性名相匹配,否则执行会出错。
FromSql执行存储过程
存储过程与SQL语句写法基本一致,使用存储过程的示例如下:
using (var dataContext = new SampleDbContext()) {
var categoryID = 1;
var query = dataContext.Categories.FromSql($"GetCategoryById {categoryID}");
var result = query.ToList();
Assert.NotNull(result);
}
这些参数的顺序必须与存储过程参数的顺序一致。
提示:使用
FromSql
执行存储过程时,如果使用'Where'、'OrderBy'等Linq语法,这些操作不会生成SQL语句,而是在.Net中对存储过程返回的集合进行过滤与排序。
ExecuteSqlCommand
在DbContext
暴露了一个Database
属性,它包括一个ExecuteSqlCommand
方法。此方法返回一个整数,表示执行的SQL语句影响的行数。有效的操作是INSERT
、UPDATE
和DELETE
,不能用于返回实体。
using (var dataContext = new SampleDbContext())
{
var categoryID = 1;
var categoryName = "Product";
var result = dataContext.Database.ExecuteSqlCommand($"UPDATE dbo.Category SET CategoryName={categoryName} WHERE CategoryID={categoryID}");
}
总结
本节介绍了Entity Framework Core中执行SQL语句和存储过程的几种方法, 希望对您有帮助,谢谢!
作者:Sweet Tang
本文地址:http://www.cnblogs.com/tdfblog/p/execute-sql-stored-procedure-in-entity-framework-core.html
欢迎转载,请在明显位置给出出处及链接。
Entity Framework Core 执行SQL语句和存储过程的更多相关文章
- EF Core 执行SQL语句和存储过程
无论ORM有多么强大,总会出现一些特殊的情况,它无法满足我们的要求.在这篇文章中,我们介绍几种执行SQL的方法. 表结构 在具体内容开始之前,我们先简单说明一下要使用的表结构. public clas ...
- Entity Framework中执行Sql语句
如果想在EF框架中执行Sql语句,其实很简单,EF里面已经提供了相关的方法(此处使用的EF为EF4.1版本). EF中提供了两个方法,一个是执行查询的Sql语句SqlQue ...
- 在Entity Framework 中执行T-sql语句
从Entity Framework 4开始在ObjectContext对象上提供了2个方法可以直接执行SQL语句:ExecuteStoreQuery<T> 和 ExecuteStoreC ...
- 如何用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语句? 返回值过于复杂 过于复杂的联合查 ...
- 监听Entity Framework生成的Sql语句
Entity Framework为我们提供了很大的方便,但有时候,我们想看看EF生成的Sql语句到底是怎样的,一种方式是我们可以启用Sql Server Profer工具.今天介 ...
- ahjesus 捕获entity framework生成的sql语句
网上这方面的资料很少,找到一个可以用的 http://code.msdn.microsoft.com/EFProviderWrappers 里面有dll可以下载,有教程,不过是E文的. 在Entity ...
- 第七节:EF Core调用SQL语句和存储过程
一. 查询类(FromSql) 1.说明 A. SQL查询必须返回实体的所有属性字段. B. 结果集中的列名必须与属性映射到的列名相匹配. C. SQL查询不能包含关联数据 D. 除Select以为的 ...
- 测试JdbcTemplate执行SQL语句和存储过程
我在项目中需要使用到oracle的语句片段和存储过程.下面就是我的测试案例: public class DbTest extends BaseTestCase { @Resource JdbcUtil ...
随机推荐
- STL的空间配置器std_alloc 笔记
STL的空间配置器std_alloc 笔记 C++的内存分配基本操作是 ::operator new(),内存释放是 ::operator delete(),这里个全局函数相当于C的malloc和fr ...
- MAC下解决eclipse卡顿或者运行慢的问题
提示:假设你已经装了固态硬盘,并且有至少8Gb的内存.如果没有的话,带来的性能提升可能不大. 1.eclipse中加载的SDK数量过多会导致程序运行缓慢,解决方法删除plaforms下面用不到的SDK ...
- 深入理解PHP对象注入
0x00 背景 php对象注入是一个非常常见的漏洞,这个类型的漏洞虽然有些难以利用,但仍旧非常危险,为了理解这个漏洞,请读者具备基础的php知识. 0x01 漏洞案例 如果你觉得这是个渣渣洞,那么请看 ...
- java.toString() ,(String),String.valueOf的区别
在Java项目的实际开发和应用中,常常需要用到将对象转为String这一基本功能.本文将对常用的转换方法进行一个总结. 常用的方法有Object#toString(),(String)要转换的对象,S ...
- EJB系列 - 消息与MDB
什么是消息 松散耦合的异步通信过程 1. 面向消息的中间件(MOM): 消息发送者称为生产者; 存储消息的位置称为目的地; 接受消息的组件称为消费者 2. 消息模型: a. 点对点:目的地成为队列, ...
- solr 搜索引擎查询
搜索引擎查询的时候://对于这些filterQuery的字段,必须是indexed="true",如果之前有这个字段后来改这个indexed属性,则需要重新建立索引,否则搜索不到S ...
- 马踏棋盘算法递归+回溯法实现 C语言
r为矩阵的行,c为矩阵的列 将结果输出到当前目录下的results.txt. 结果将给出:1.是否存在路径使马可以按要求走遍所有的方格: 2.解的总数: 3.程序执行的时间: #include< ...
- 手把手教你 基础 整合最优雅SSM框架:SpringMVC + Spring
我们看招聘信息的时候,经常会看到这一点,需要具备SSH框架的技能:而且在大部分教学课堂中,也会把SSH作为最核心的教学内容. 但是,我们在实际应用中发现,SpringMVC可以完全替代Struts,配 ...
- JavaScript函数部分
函数部分学习:+parseInt(): -parseInt()函数将其收到的任何输入值(通常是字符串)转换成整数类型输出,如果转换失败就返回NaN. -parseInt(“参数”,第二参数基数):没有 ...
- 用Eclipse的snippets功能实现代码重用
snippets功能实现代码重用 Snippets 代码片段是Eclipse的一个插件. 很多时候可以通过这个功能,重复使用常用的代码片段,加快开发效率. 创建一个代码段的步骤: 在Eclipse的e ...