當前位置:
首頁 > 知識 > Entity Framework Core 執行SQL語句和存儲過程

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

Entity Framework Core 執行SQL語句和存儲過程

如果您不使用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語句和存儲過程


更多優質內容推薦:

有錢任性,某公司豪擲500萬幫助20左右年輕人找工作,起因是做善良的人:

http://www.ujiuye.com/zt/jyfc/?wt.bd=zdy35845tt

學IT,用周末給自己加薪!

http://www.ujiuye.com/zt/zmb/?wt.bd=zdy35845tt

IT職業教育:http://xue.ujiuye.com/

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 IT優就業 的精彩文章:

有人告訴我一篇文章就可以學會Gulp(Getting started with Gulp)!你敢信?
TypeScript01 編譯環境的搭建、字元串特性
什麼是最全的CSS hack?這就是最全的CSS hack沒有之一!
基於.net的微服務架構下的開發測試環境運維實踐
Asp.Net MVC-4-過濾器:認證與授權

TAG:IT優就業 |

您可能感興趣

學習MySQL的select語句
try-catch語句
MySql 優化 group by 語句
postgresql的copy語句和備份恢復
mybatis框架的動態sql語句
英語口語天天練!實用口語句子匯總!What is your opinion?
Scala IF...ELSE 語句
djang常用查詢SQL語句
VBScript 條件語句
Go 系列教程—10.switch 語句
Mybatis 查詢語句結果集總結
sql語句的使用&mysql單表練習(小白專用版之二)
常用傻瓜式SQL Server語句,優化資料庫
initial語句中的並行執行和串列執行
總是被嘲笑英語句式Chinglish?小眾高分寫作句式打包送你
Perl 條件語句
一條SQL語句在MySQL中是如何執行的?
MySQL性能優化之SQL語句優化
忘了Python關鍵語句?這份備忘錄拯救你的記憶
小鄭搞碼事:為什麼建議大家在JS代碼中,永遠不要使用with語句