推广平台网站制作,驾校网站建设方案,室内设计师联盟网站,花生壳动态域名做网站无论ORM有多么强大#xff0c;总会出现一些特殊的情况#xff0c;它无法满足我们的要求。在这篇文章中#xff0c;我们介绍几种执行SQL的方法。
表结构
在具体内容开始之前#xff0c;我们先简单说明一下要使用的表结构。 public class Category{ public …无论ORM有多么强大总会出现一些特殊的情况它无法满足我们的要求。在这篇文章中我们介绍几种执行SQL的方法。
表结构
在具体内容开始之前我们先简单说明一下要使用的表结构。 public class Category{ public int CategoryID { get; set; } public string CategoryName { get; set; }}
在Category定义了两个字段CategoryID、CategoryName。 public class SampleDbContext : DbContext{ public virtual DbSetCategory 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);EntityTypeBuilderCategory entityTypeBuilder modelBuilder.EntityCategory();entityTypeBuilder.ToTable(Category);entityTypeBuilder.HasKey(e e.CategoryID);entityTypeBuilder.Property(e e.CategoryID).UseSqlServerIdentityColumn();}}
我们使用SampleDbContext来访问数据库。
FromSql执行SQL语句
Entity Framework Core为DbSetTEntity提供了一个扩展方法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 Nselect * from Category where CategoryIDp0,Np0 int,p01 如果您不使用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 CategoryIDp0 and CategoryNamep1categoryID, categoryName); var result query.ToList();Assert.NotNull(result);}
在上述SQL语句中中将p0映射到categoryID、 p1映射到categoryName。
FromSql扩展方法返回的是IQueryableTEntity对象要们还可以接着使用一些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 NSELECT [item].[CategoryID], [item].[CategoryName]FROM ( select * from Category) AS [item]WHERE [item].[CategoryID] __categoryID_1ORDER BY [item].[CategoryName],N__categoryID_1 int,__categoryID_11 提示使用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语句和存储过程的几种方法 希望对您有帮助谢谢
相关文章
全球首发免费的MySql for Entity Framework Core.NET Core 使用Dapper 操作MySQL在.NET Core中使用MySQL5.7的JSON类型字段全文索引 - Pomelo.EFCore.MySqlEntity Framework Core 生成跟踪列在Apworks数据服务中使用基于Entity Framework Core的仓储Repository实现Entity Framework Core的贴心优雅处理带默认值的数据库字段Entity Framework Core 实现MySQL 的TimeStamp/RowVersion 并发控制Entity Framework Core 软删除与查询过滤器Entity Framework Core 命名约定全文索引 - Pomelo.EFCore.MySqlEntity Framework Core 批处理语句
原文地址http://www.cnblogs.com/tdfblog/p/execute-sql-stored-procedure-in-entity-framework-core.html .NET社区新闻深度好文微信中搜索dotNET跨平台或扫描二维码关注