<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
無論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
來存取資料庫。
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語句中返回所有列,並且列名必須與實體屬性名相匹配,否則執行會出錯。
儲存過程與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中對儲存過程返回的集合進行過濾與排序。
在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語句和儲存過程的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45