Entity Framework Core中執(zhí)行SQL語(yǔ)句和存儲(chǔ)過(guò)程的方法介紹
無(wú)論ORM有多么強(qiáng)大,總會(huì)出現(xiàn)一些特殊的情況,它無(wú)法滿足我們的要求。在這篇文章中,我們介紹幾種執(zhí)行SQL的方法。
表結(jié)構(gòu)
在具體內(nèi)容開始之前,我們先簡(jiǎn)單說(shuō)明一下要使用的表結(jié)構(gòu)。
public class Category { public int CategoryID { get; set; } public string CategoryName { get; set; } }
在Category
定義了兩個(gè)字段: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
來(lái)訪問(wèn)數(shù)據(jù)庫(kù)。
FromSql執(zhí)行SQL語(yǔ)句
Entity Framework Core為DbSet<TEntity>
提供了一個(gè)擴(kuò)展方法FromSql
,用于執(zhí)行SQL語(yǔ)句或存儲(chǔ)過(guò)程,以下示例使用FromSql
加載所有的數(shù)據(jù)。
using (var dataContext = new SampleDbContext()) { var query = dataContext.Categories.FromSql("select * from Category"); var result = query.ToList(); }
對(duì)于帶有參數(shù)的SQL語(yǔ)句,我們使用C# 6 語(yǔ)法將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,而是轉(zhuǎn)化為參數(shù)化的SQL語(yǔ)句,這有助于防止SQL注入攻擊。我們可以使用SQL Server Profiler幫我們驗(yàn)證:
exec sp_executesql N'select * from Category where CategoryID=@p0 ',N'@p0 int',@p0=1
如果您不使用C# 6的語(yǔ)法特征,我們必須使用 @p0、@p1 ... @pn 做為SQL語(yǔ)句的參數(shù):
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語(yǔ)句中中,將@p0
映射到categoryID
、@ p1
映射到categoryName
。
FromSql
擴(kuò)展方法返回的是IQueryable<TEntity>
對(duì)象,要們還可以接著使用一些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(); }
不過(guò)在這里,使用的是子查詢,使用SQL Server Profiler捕獲到的SQL語(yǔ)句如下:
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
時(shí),需要在執(zhí)行的SQL語(yǔ)句中返回所有列,并且列名必須與實(shí)體屬性名相匹配,否則執(zhí)行會(huì)出錯(cuò)。
FromSql執(zhí)行存儲(chǔ)過(guò)程
存儲(chǔ)過(guò)程與SQL語(yǔ)句寫法基本一致,使用存儲(chǔ)過(guò)程的示例如下:
using (var dataContext = new SampleDbContext()) { var categoryID = 1; var query = dataContext.Categories.FromSql($"GetCategoryById {categoryID}"); var result = query.ToList(); Assert.NotNull(result); }
這些參數(shù)的順序必須與存儲(chǔ)過(guò)程參數(shù)的順序一致。
提示:使用
FromSql
執(zhí)行存儲(chǔ)過(guò)程時(shí),如果使用'Where'、'OrderBy'等Linq語(yǔ)法,這些操作不會(huì)生成SQL語(yǔ)句,而是在.Net中對(duì)存儲(chǔ)過(guò)程返回的集合進(jìn)行過(guò)濾與排序。
ExecuteSqlCommand
在DbContext
暴露了一個(gè)Database
屬性,它包括一個(gè)ExecuteSqlCommand
方法。此方法返回一個(gè)整數(shù),表示執(zhí)行的SQL語(yǔ)句影響的行數(shù)。有效的操作是INSERT
、UPDATE
和DELETE
,不能用于返回實(shí)體。
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}"); }
總結(jié)
到此這篇關(guān)于Entity Framework Core中執(zhí)行SQL語(yǔ)句和存儲(chǔ)過(guò)程的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Entity Framework Core使用控制臺(tái)程序生成數(shù)據(jù)庫(kù)表
- Entity Framework Core延遲加載(懶加載)用法
- Entity?Framework?Core實(shí)現(xiàn)Like查詢?cè)斀?/a>
- Entity Framework Core批處理SQL語(yǔ)句
- Entity Framework Core實(shí)現(xiàn)軟刪除與查詢過(guò)濾器
- Entity Framework Core生成列并跟蹤列記錄
- ASP.NET Core在WebApi項(xiàng)目中使用MiniProfiler分析Entity Framework Core
- Entity Framework Core工具使用命令行
- Entity?Framework?Core關(guān)聯(lián)刪除
- 詳解如何在ASP.NET Core中應(yīng)用Entity Framework
- Entity Framework Core對(duì)Web項(xiàng)目生成數(shù)據(jù)庫(kù)表
相關(guān)文章
ASP.NET oledb連接Access數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了ASP.NET oledb連接Access數(shù)據(jù)庫(kù)的方法,需要的朋友可以參考下2015-01-01asp.net 使用js分頁(yè)實(shí)現(xiàn)異步加載數(shù)據(jù)
這篇文章主要介紹了asp.net使用js分頁(yè)實(shí)現(xiàn)異步加載數(shù)據(jù),需要的朋友可以參考下2014-04-04ASP.NET操作Word的IIS權(quán)限設(shè)置
檢索 COM 類工廠中 CLSID 為 {00024500-0000-0000-C000-000000000046} 的組件時(shí)失敗,原因是出現(xiàn)以下錯(cuò)誤: 80070005。2011-02-02ASP.NET 2.0 中的創(chuàng)建母版頁(yè)
ASP.NET 2.0 中的創(chuàng)建母版頁(yè)...2006-09-09動(dòng)態(tài)改變ASP.net頁(yè)面標(biāo)題和動(dòng)態(tài)指定頁(yè)面樣式表的方法
動(dòng)態(tài)改變ASP.net頁(yè)面標(biāo)題和動(dòng)態(tài)指定頁(yè)面樣式表的方法...2007-04-04ASP.NET用SignalR建立瀏覽器和服務(wù)器的持久連接詳解
這篇文章主要給大家介紹了ASP.NET用SignalR如何建立瀏覽器和服務(wù)器的持久連接,文章先給大家簡(jiǎn)單介紹了配置環(huán)境,而后通過(guò)實(shí)戰(zhàn)來(lái)給大家詳細(xì)的介紹了實(shí)現(xiàn)的過(guò)程,文中通過(guò)一步步的步驟介紹的很詳細(xì),感興趣的朋友們可以參考借鑒,下面來(lái)一起看看吧。2016-12-12asp.net DataTable導(dǎo)出Excel自定義列名的方法
本文分享了asp.net DataTable導(dǎo)出Excel 自定義列名的具體實(shí)現(xiàn)方法,步驟清晰,代碼詳細(xì),需要的朋友可以參考借鑒,下面就跟小編一起來(lái)看看吧2016-12-12.NET Core 處理 WebAPI JSON 返回?zé)┤说膎ull為空
這篇文章主要介紹了.NET Core 處理 WebAPI JSON 返回?zé)┤说膎ull為空,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01.NET截取指定長(zhǎng)度漢字超出部分以"..."代替 實(shí)例分享
.NET截取指定長(zhǎng)度漢字超出部分以"..."代替 實(shí)例分享,需要的朋友可以參考一下2013-06-06