EF Core 執行SQL語句和存儲過程

来源:https://www.cnblogs.com/star8521/archive/2020/05/27/12973344.html
-Advertisement-
Play Games

無論ORM有多麼強大,總會出現一些特殊的情況,它無法滿足我們的要求。在這篇文章中,我們介紹幾種執行SQL的方法。 表結構 在具體內容開始之前,我們先簡單說明一下要使用的表結構。 public class Category { public int CategoryID { get; set; } p ...


無論ORM有多麼強大,總會出現一些特殊的情況,它無法滿足我們的要求。在這篇文章中,我們介紹幾種執行SQL的方法。

表結構

在具體內容開始之前,我們先簡單說明一下要使用的表結構。

public class Category
{
    public int CategoryID
    {
        get;
        set;
    }
    public string CategoryName
    {
        get;
        set;
    }
}

Category定義了兩個欄位:CategoryIDCategoryName

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

EF 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語句影響的行數。有效的操作是INSERTUPDATEDELETE,不能用於返回實體。

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語句和存儲過程的幾種方法, 希望對您有幫助,謝謝!

原文地址:https://www.cnblogs.com/tdfblog/p/execute-sql-stored-procedure-in-entity-framework-core.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • spring博大精深,衍生出了兩大系列:spring boot 和sping cloud快速業務開發模式。 我們進行具體開發時,經常看到這樣以Enable*開頭的註解,如圖 ​ ​ 等等好多例子。。。框架自帶的Enable* @EnableAspectJAutoProxy 開啟對AspectJ自動代 ...
  • 通過上一篇 Istio Sidecar註入原理 文章可以發現,在應用提交到kubernate部署時已經同時註入了Sidecar應用。 細心的話應該還可以發現,除了註入了istio-proxy應用外,另外還有註入一個istio-init的 Init Containers。接下來一起來看看在這兩個註入... ...
  • 11.函數 函數在Python占有非常重要的地位,可以實現代碼復用,增強代碼可讀性等等。在Python在函數通常被分為常規函數、匿名函數和高階函數。 11.1常規函數 在Python定義一個函數使用def關鍵字,其格式如下所示: def functionName(para1,para2,...,pa ...
  • 解最短路的必要基礎(BFS與DFS,STL,如何存圖)DFS與BFS問題引入DFS深度優先搜索(Depth First Search):解析:過程:BFSBFS引入BFS遍歷樹的過程講解對於圖上的BFS小結DFS與BFS問題引入 有一天,你穿越到Clannad(炒雞好看的游戲與番劇)的小鎮。你知道小 ...
  • PPT介紹目錄: 工業互聯網的現狀 平臺介紹 技術路線 人力資源 現實問題 成本中心 工業互聯網的發展 兩大推動引擎 用戶需求的改變 片面與極端 由點到面,點面結合 突破點 現實路徑 落腳點 工業互聯網怎麼建 一句話表示-方法論 怎麼成功 體系理念 工業互聯網未來的規劃 iNeuOS介紹 文章: 《 ...
  • IsPostBack:獲取一個值,該值指示頁是第一次呈現還是為了響應回發而載入。 一般的話如果第一次請求是get的話,那麼IsPostBack會為false,如果接下來post請求,則為true;這樣可以區分第一次和其他按鈕請求的情況。 但今天使用jQuery在主頁面的一個超鏈接post調用子頁面的 ...
  • .Net 提交頁面,js修改的Label值會丟掉 版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。 本文鏈接:https://blog.csdn.net/chenghaibing2008/article/details/9011043 當用js ...
  • C#實現密文解密 簡介:此方法一般用於對密碼加密後的解密。 代碼: private static string GetPwd(string pwd) { var sRet = string.Empty; for (int i = 0; i < pwd.Length; i++) { sRet = sR ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...