EF Core 執行原生SQL語句

文章目錄

  • 前言
  • 一、執行查詢(返回數據)
    • 1) 使用 FromSqlRaw或 FromSqlInterpolated 方法,適用于 DbSet<T>,返回實體集合。
    • 2)結合 LINQ 查詢
    • 3)執行任意原生SQL查詢語句(使用ADO.Net)
  • 二、執行非查詢操作(增刪改)
    • 1)使用 ExecuteSqlRaw() 或 ExecuteSqlInterpolated() 、ExecuteSqlInterpolatedAsync()方法,返回受影響的行數。
  • 三、調用存儲過程
    • 1)執行查詢存儲過程
    • 2)執行非查詢存儲過程
  • 四、事務處理
    • 1)確保多個 SQL 操作原子性
  • 五、原生 SQL 查詢的注意事項
  • 總結


前言

為什么要寫原生SQL語句?

  1. 盡管EF Core已經非常強大,但是任然存在著無法被寫成標準EF Core調用方法的SQL語句,少數情況下任然需要寫原生SQL。
  2. 存在問題:可能無法跨數據庫操作。

一、執行查詢(返回數據)

1) 使用 FromSqlRaw或 FromSqlInterpolated 方法,適用于 DbSet,返回實體集合。

示例:查詢數據(建議使用FromSqlInterpolated,防止SQL注入

var blogs = context.Blogs.FromSqlRaw("SELECT * FROM Blogs WHERE Rating > {0}", 3).ToList();// 或使用插值字符串(參數化,防注入)
var rating = 3;
var blogsSafe = context.Blogs.FromSqlInterpolated($"SELECT * FROM Blogs WHERE Rating > {rating}").ToList();

2)結合 LINQ 查詢

var filteredBlogs = context.Blogs.FromSqlInterpolated("SELECT * FROM Blogs").Where(b => b.Url.Contains("dotnet")).OrderBy(b => b.Rating).ToList();

3)執行任意原生SQL查詢語句(使用ADO.Net)

DbConnection conn=dbContext.Database.GetDbConnection();
if (conn.State != ConnectionState.Open)
{ conn.Open();
}
using (var cmd = conn.CreateCommand())
{cmd.CommandText = "select Title,Content from T_Articles where Title like '%反反復復%'";using (var reader = await cmd.ExecuteReaderAsync()){while (await reader.ReadAsync()){string title = reader.GetString(0);string content= reader.GetString(1);Console.WriteLine(title+","+content);}}}

二、執行非查詢操作(增刪改)

1)使用 ExecuteSqlRaw() 或 ExecuteSqlInterpolated() 、ExecuteSqlInterpolatedAsync()方法,返回受影響的行數。

示例:更新數據

var rowsAffected = context.Database.ExecuteSqlRaw("UPDATE Blogs SET Rating = 5 WHERE Name LIKE '%EF Core%'");// 參數化示例
var minRating = 3;
var rowsSafe = await context.Database.ExecuteSqlInterpolatedAsync($"DELETE FROM Blogs WHERE Rating < {minRating}");

三、調用存儲過程

1)執行查詢存儲過程

var blogs = context.Blogs.FromSqlRaw("EXEC GetTopRatedBlogs @p0", 5).ToList();

2)執行非查詢存儲過程

context.Database.ExecuteSqlRaw("EXEC ArchiveOldBlogs @p0", DateTime.Now.AddYears(-1));

四、事務處理

1)確保多個 SQL 操作原子性

using (var transaction = context.Database.BeginTransaction())
{try{context.Database.ExecuteSqlRaw("UPDATE Blogs SET Rating = 5 WHERE BlogId = 1");context.Database.ExecuteSqlRaw("DELETE FROM Blogs WHERE BlogId = 2");transaction.Commit();}catch{transaction.Rollback();}
}

五、原生 SQL 查詢的注意事項

  1. 參數化查詢:始終使用參數化輸入(如 {0} 或插值語法)避免 SQL 注入。
  2. 列匹配:查詢返回的列名必須與實體屬性名匹配,或通過 AS 別名映射。
  3. 跟蹤變更:默認跟蹤實體變更,若無需跟蹤可加 .AsNoTracking()。
  4. 數據庫兼容性:SQL 語法需適配具體數據庫(如 SQL Server 和 SQLite 的差異)。
  5. 性能:僅在必要時使用原生 SQL,優先選擇 LINQ 以保證類型安全和可維護性。

總結

一般情況下Linq操作就足夠了,盡量不要用原生SQL。

  1. EF Core 的原生 SQL 方法適用于特定場景,但需謹慎使用以確保安全性和可維護性。優先考慮 LINQ,復雜場景再選擇原生 SQL
  2. 非查詢SQL用ExecuteSqlInterpolatedAsync()
  3. 針對實體的SQL查詢用FromSqlInterpolated()
  4. 復雜SQL查詢用ADO.NET的方式或者Dapper等。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/75140.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/75140.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/75140.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Unity LOD Group動態精度切換算法(基于視錐+運動速度)技術詳解

一、動態LOD技術背景與核心挑戰 1. 傳統LOD系統的局限 靜態閾值切換&#xff1a;僅基于距離的切換在動態場景中表現不佳 視覺突變&#xff1a;快速移動時LOD層級跳變明顯 性能浪費&#xff1a;靜態算法無法適應復雜場景變化 對惹&#xff0c;這里有一個游戲開發交流小組&…

MyBatis復雜查詢——一對一、一對多

目錄 &#xff08;一&#xff09;復雜查詢&#xff1a;1對1關系 【任務】數據庫里有學生表(student)和學生證信息表(student_card)&#xff0c;表結構如下所示&#xff0c;要求使用MyBatis框架查詢所有的學生信息以及每位學生的學生證信息 解決方案1&#xff1a;關聯查詢實現…

【服務端】使用conda虛擬環境部署Django項目

寫在開頭 為了與客戶端的Deep search配合&#xff0c;需要整一個后臺管理來保存和管理deep search的數據資料。選擇前端框架Vue-Vben-Admin Django后臺服務來實現這個項目。 廢話結束&#xff0c;從零開始。。。。 一、環境搭建 1. 安裝 Anaconda 下載 Anaconda&#xff1…

Python爬蟲-爬取大麥網演出詳情頁面數據

前言 本文是該專欄的第50篇,后面會持續分享python爬蟲干貨知識,記得關注。 本文,筆者以大麥網平臺為例。基于Python,實現獲取演出詳情頁面的演出信息。 廢話不多說,具體實現思路和詳細邏輯,筆者將在正文結合完整代碼進行詳細介紹。接下來,跟著筆者直接往下看正文詳細內…

多onnx模型導出合并調研(文本檢測+方向分類+文本識別)

??主頁:吾名招財 ??簡介:工科學碩,研究方向機器視覺,愛好較廣泛… ???簽名:面朝大海,春暖花開! 多onnx模型合并導出調研(文本檢測+方向分類+文本識別) 引言1,嘗試合并兩個模型(文本方向分類+文本識別模型)(并行合并)(1)文本方向分類(2)文本識別模型(…

Flink介紹——實時計算核心論文之S4論文詳解

引入 在上一篇我們對Flink的發展歷史有了全局的了解&#xff0c;下面我們會通讀幾篇分布式實時處理相關的重要論文&#xff0c;從S4到Storm&#xff0c;再從MillWheel到Dataflow&#xff0c;最后到Flink。 通過深入梳理分布式實時處理技術的發展脈絡&#xff0c;了解這些年技…

【商城實戰(97)】ELK日志管理系統的全面應用

【商城實戰】專欄重磅來襲!這是一份專為開發者與電商從業者打造的超詳細指南。從項目基礎搭建,運用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用戶、商品、訂單等核心模塊開發,再到性能優化、安全加固、多端適配,乃至運營推廣策略,102 章內容層層遞進。無論是想…

Linux系統-ls命令

一、ls命令的定義 Linux ls命令&#xff08;英文全拼&#xff1a;list directory contents&#xff09;用于顯示指定工作目錄下之內容&#xff08;列出目前工作目錄所含的文件及子目錄)。 二、ls命令的語法 ls [選項] [目錄或文件名] ls [-alrtAFR] [name...] 三、參數[選項…

游戲被外掛攻破?金融數據遭篡改?AI反作弊系統實戰方案(代碼+詳細步驟)

一、背景與需求分析 隨著游戲行業與金融領域的數字化進程加速,作弊行為(如游戲外掛、金融數據篡改)日益復雜化。傳統基于規則的防御手段已難以應對新型攻擊,而AI技術通過動態行為分析、異常檢測等能力,為安全領域提供了革命性解決方案。本文以游戲反作弊系統和金融數據安…

Node.js 路由 - 初識 Express 中的路由

目錄 Node.js 路由 - 初識 Express 中的路由 1. 什么是路由&#xff1f; 2. 安裝 Express 3. 創建 server.js 4. 運行服務器 5. 測試路由 5.1 訪問主頁 5.2 訪問用戶路由 5.3 發送 POST 請求 6. 結語 1. 什么是路由&#xff1f; 路由&#xff08;Routing&#xff09…

面經-項目

項目 項目(重點)問題1:描述在網頁中題目點擊提交后到題目結果出現的一系列后臺反應【1】如何獲取到用戶提交的代碼的?【2】_1. 題目細節都有哪些?【2】_2. 題目信息怎么存儲的?【3】負載均衡算法的實現?【4】oj_server怎么連接對應的compile_server(編譯主機)的?【5】oj_…

網絡基本概念認識(2)

目錄 前言&#xff1a; 局域網協議 MAC/IP地址 Socket編程 TCP/UDP 網絡字節序 前言&#xff1a; 本文同樣作為博主的二刷網絡課程的文章&#xff0c;主要涵蓋的主題還是網絡基本概念的認識&#xff0c;從上一篇文章遺漏的點加上引入的一些知識點共同組成當前的知識點。…

Kafka中的消息是如何存儲的?

大家好&#xff0c;我是鋒哥。今天分享關于【Kafka中的消息是如何存儲的&#xff1f;】面試題。希望對大家有幫助&#xff1b; 1000道 互聯網大廠Java工程師 精選面試題-Java資源分享網 在 Kafka 中&#xff0c;消息是通過 日志&#xff08;Log&#xff09; 的方式進行存儲的。…

openEuler24.03 LTS下安裝ZooKeeper集群

目錄 前提條件 ZooKeeper集群規劃 下載ZooKeeper 解壓 配置環境變量 配置ZooKeeper 配置zoo.cfg 配置myid 分發到其他機器 修改其他機器myid 啟動集群 關閉集群 集群啟停腳本 前提條件 準備3臺Linux機器&#xff0c;并安裝好Java8 ZooKeeper集群規劃 node2node3…

Python 實現機器學習小項目實戰教程*

markdown 復制 Python 實現機器學習小項目實戰教程 本教程將通過一個完整的機器學習項目案例&#xff0c;從數據預處理到模型部署&#xff0c;幫助初學者快速掌握機器學習核心流程。項目以經典的鳶尾花分類為例&#xff0c;使用 Scikit-learn 庫實現。 1. 項目概述 目標 構…

rust學習筆記21-閉包

在 Rust 中&#xff0c;閉包&#xff08;Closures&#xff09; 是一種可以捕獲其環境中的變量的匿名函數。它們非常靈活&#xff0c;既可以作為普通函數使用&#xff0c;也可以捕獲和操作定義它們的作用域中的變量。閉包是 Rust 中處理短小邏輯代碼塊的強大工具&#xff0c;特別…

linux實現rsync+sersync實時數據備份

1.概述 rsync(Remote Sync) 是一個Unix/linux系統下的文件同步和傳輸工具 2.端口和運行模式 tcp/873 采用C/S模式&#xff08;客戶端/服務器模式&#xff09; 3.特點 可以鏡像保存整個目錄和文件第一次全量備份(備份全部的文件),之后是增量備份(只備份變化的文件) 4. 數…

【第30節】MFC編程:ListCtrl控件和TreeCtrl控件

目錄 引言 一、高級控件ListCtrl 二、高級控件TreeCtrl 三、Shell控件 四、CImageList 五、綜合代碼示例 引言 在MFC編程里&#xff0c;高級控件能大幅提升應用程序的交互性與功能性。接下來&#xff0c;咱們會詳細講講ListCtrl和TreeCtrl這兩個高級控件。不僅會介紹它們…

為什么 ThreadLocalMap 的 key 是弱引用 value是強引用

問題一&#xff1a;為什么 ThreadLocalMap 的 key 是弱引用&#xff1f; 【假設 Entry 的 key 是對 ThreadLocal 對象的強引用】&#xff1a;這個 Entry 又持有 ThreadLocal 對象和 value 對象的強引用。如果在其他地方都沒有對這個 ThreadLocla 對象的引用了、然后在使用 Thr…

DeepSeek本地部署(linux)

一、下載并安裝Ollama 1.下載Ollama Ollama官網:Ollama 點擊"Download",會跳轉至下載頁面。 1.1在線下載安裝 可復制此命令到Linux服務器進行在線下載,如下載速度過慢,可選擇離線下載安裝。 curl -fsSL https://ollama.com/install.sh | sh1.2離線下載安裝 …