EF Core執行原生SQL語句

目錄

EFCore執行非查詢原生SQL語句

為什么要寫原生SQL語句

執行非查詢SQL語句

有SQL注入漏洞

ExecuteSqlInterpolatedAsync?

其他方法

執行實體相關查詢原生SQL語句

FromSqlInterpolated

局限性

執行任意原生SQL查詢語句

什么時候用ADO.NET

執行任意SQL

Dapper

總結


EFCore執行非查詢原生SQL語句

為什么要寫原生SQL語句

  1. 盡管EF Core已經非常強大,但是仍然存在著無法被寫成標準EF Core調用方法的SQL語句,少數情況下仍然需要寫原生SQL。
  2. 可能無法跨數據庫。
  3. 三種情況:非查詢語句、實體查詢、任意SQL查詢。

執行非查詢SQL語句

使用dbCtx.Database. ExecuteSqlInterpolated ();

dbCtx.Database. ExecuteSqlInterpolatedAsync()方法來執行原生的非查詢SQL語句。

static async Task Main(string[] args)
{using (MyDbContext ctx = new MyDbContext()){string strName = "小劉";await ctx.Database.ExecuteSqlInterpolatedAsync(@$"insert into T_Books(Name,Author,Price)select Name,{strName},Pricefrom T_Books where Price > 20");}
}

有SQL注入漏洞

字符串內插的方式會不會有SQL注入攻擊漏洞嗎?查看一下執行的SQL語句吧。

insert into T_Books(Name,Author,Price)
select Name,@p0,Price
from T_Books where Price > 20
ExecuteSqlInterpolatedAsync?

字符串內插如果賦值給string變量,就是字符串拼接;字符串內插如果賦值給FormattableString變量,編譯器就會構造FormattableString 對象。打印FormattableString的成員試試看。

static async Task Main(string[] args)
{using (MyDbContext ctx = new MyDbContext()){string strName = "小劉";FormattableString sql = (@$"insert into T_Books(Name,Author,Price)select Name,{strName},Pricefrom T_Books where Price > 20");Console.WriteLine("Format:" + sql.Format);Console.WriteLine("參數:" + string.Join(",", sql.GetArguments()));}
}

ExecuteSqlInterpolatedAsync()的參數是FormattableString類型。因此ExecuteSqlInterpolatedAsync會進行參數化SQL的處理。

其他方法

除了ExecuteSqlInterpolated ()、ExecuteSqlInterpolatedAsync() ,還有ExecuteSqlRaw()、ExecuteSqlRawAsync() 也可以執行原生SQL語句,但需要開發人員自己處理查詢參數,因此不推薦使用。

執行實體相關查詢原生SQL語句

FromSqlInterpolated

如果要執行的原生SQL是一個查詢語句,并且查詢的結果也能對應一個實體,就可以調用對應實體的DbSet的FromSqlInterpolated()方法來執行一個查詢SQL語句,同樣使用字符串內插來傳遞參數。

static async Task Main(string[] args)
{using (MyDbContext ctx = new MyDbContext()){string NamePattern = "%計算%";var queryable = ctx.Books.FromSqlInterpolated(@$"select * from T_Books where Name Like {NamePattern} order by newid()");foreach (var item in queryable){Console.WriteLine(item.Id + item.Name);}}
}
select * from T_Books where Name Like @p0 order by newid()

FromSqlInterpolated()方法的返回值是IQueryable類型的,因此我們可以在實際執行IQueryable之前,對IQueryable進行進一步的處理。

把只能用原生SQL語句寫的邏輯用FromSqlInterpolated()去執行,然后把分頁、分組、二次過濾、排序、Include等其他邏輯盡可能仍然使用EF Core的標準操作去實現。

局限性

  1. SQL 查詢必須返回實體類型對應數據庫表的所有列;
  2. 結果集中的列名必須與屬性映射到的列名稱匹配。
  3. 只能單表查詢,不能使用Join語句進行關聯查詢。但是可以在查詢后面使用Include()來進行關聯數據的獲取。

執行任意原生SQL查詢語句

什么時候用ADO.NET

FromSqlInterpolated()只能單表查詢,但是在實現報表查詢等的時候,SQL語句通常是非常復雜的,不僅要多表Join,而且返回的查詢結果一般也都不會和一個實體類完整對應。因此需要一種執行任意SQL查詢語句的機制。

EF Core中允許把視圖或存儲過程映射為實體,因此可以把復雜的查詢語句寫成視圖或存儲過程,然后再聲明對應的實體類,并且在DbContext中配置對應的DbSet。

不推薦寫存儲過程;項目復雜查詢很多,導致:視圖太多;非實體的DbSet;DbSet膨脹。

執行任意SQL

dbCxt.Database.GetDbConnection()獲得ADO.NET Core的數據庫連接對象。

Dapper

推薦用Dapper等框架執行原生復雜查詢SQL。

EF Core和Dapper并不是對立,可以同時使用,EF Core簡單方便

var items = ctx.Database.GetDbConnection().Query<GroupArticleByPrice>("select Price,Count(*) PCount from T_Books group by price");
foreach (var item in items)
{Console.WriteLine($"Price{item.Price},Count{item.PCount}");
}

總結

一般Linq操作就夠了,盡量不用寫原生SQL;

  1. 非查詢SQL用ExecuteSqlInterpolated () ;
  2. 針對實體的SQL查詢用FromSqlInterpolated()。
  3. 復雜SQL查詢用ADO.NET的方式或者Dapper等。

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

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

相關文章

Java中網絡編程的學習

目錄 網絡編程概述 網絡模型 網絡通信三要素: IP 端口號 通信協議 IP地址&#xff08;Internet Protocol Address&#xff09; 端口號 網絡通信協議 TCP 三次握手 四次揮手 UDP TCP編程 客戶端Socket的工作過程包含以下四個基本的步驟&#xff1a; 服務器程序…

HarmonyOS NEXT開發進階(七):頁面跳轉

文章目錄 一、前言二、頁面跳轉三、頁面返回四、頁面返回前增加確認對話框4.1 系統的默認詢問框4.2 自定義詢問框 五、拓展閱讀 一、前言 APP開發過程中&#xff0c;多頁面跳轉場景十分常見&#xff0c;例如&#xff0c;登錄 -> 首頁 -> 個人中心。在鴻蒙開發中&#xf…

【Python】第一彈---解鎖編程新世界:深入理解計算機基礎與Python入門指南

?個人主頁&#xff1a; 熬夜學編程的小林 &#x1f497;系列專欄&#xff1a; 【C語言詳解】 【數據結構詳解】【C詳解】【Linux系統編程】【MySQL】【Python】 目錄 1、計算機基礎概念 1.1、什么是計算機 1.2、什么是編程 1.3、編程語言有哪些 2、Python 背景知識 2.…

LeetCode:131. 分割回文串

跟著carl學算法&#xff0c;本系列博客僅做個人記錄&#xff0c;建議大家都去看carl本人的博客&#xff0c;寫的真的很好的&#xff01; 代碼隨想錄 LeetCode:131. 分割回文串 給你一個字符串 s&#xff0c;請你將 s 分割成一些子串&#xff0c;使每個子串都是回文串。返回 s 所…

優化神馬關鍵詞排名原理(優化神馬搜索引擎關鍵詞排名規則)

優化神馬&#xff08;即百度&#xff09;關鍵詞排名的原理主要基于搜索引擎的算法和用戶體驗的考量。以下是一些關鍵的優化原理&#xff1a; 一、搜索引擎算法 網頁重要性評估&#xff1a; 搜索引擎通過復雜的算法評估網頁的重要性和權威性&#xff0c;如基于PageRank的評估方…

學習threejs,使用FlyControls相機控制器

&#x1f468;??? 主頁&#xff1a; gis分享者 &#x1f468;??? 感謝各位大佬 點贊&#x1f44d; 收藏? 留言&#x1f4dd; 加關注?! &#x1f468;??? 收錄于專欄&#xff1a;threejs gis工程師 文章目錄 一、&#x1f340;前言1.1 ??THREE.FlyControls 相機控制…

Vue 3前端與Python(Django)后端接口簡單示例

項目 后端&#xff08;Django&#xff09;前端&#xff08;Vue 3&#xff09; 后端&#xff08;Django&#xff09; 創建Django項目和應用&#xff1a; 確保你已經安裝了Django。如果沒有安裝&#xff0c;可以使用以下命令安裝&#xff1a; pip install django創建一個新的Dja…

MCP Server開發的入門教程(python和pip)

使用python技術棧開發的簡單mcp server 需要安裝 MCP server的需要使用python-sdk,python需要 3.10,安裝如下 pip install mcpPS: MCP官方使用的是uv包管理工具,我平時使用pip比較多,所以文中以pip為主。因為mcp的一些依賴包版本并不是最新的,所以最好弄一個干凈的環境…

Spark vs Flink分布式數據處理框架的全面對比與應用場景解析

1. 引言 1.1 什么是分布式數據處理框架 隨著數據量的快速增長&#xff0c;傳統的單機處理方式已經無法滿足現代數據處理需求。分布式數據處理框架應運而生&#xff0c;它通過將數據分片分布到多臺服務器上并行處理&#xff0c;提高了任務的處理速度和效率。 分布式數據處理框…

隱私計算,構建安全的未來數據空間

大數據產業創新服務媒體 ——聚焦數據 改變商業 在醫療領域&#xff0c;不同醫院之間需要共享患者數據&#xff0c;以提供更全面準確的診斷和治療方案。 傳統的數據處理方式通常是數據經過轉換隱藏重要數據后再進行分析&#xff0c;雖然可以保護數據隱私&#xff0c;但在數據源…

PID控制器 (Proportional-Integral-Derivative Controller) 算法詳解及案例分析

PID控制器 (Proportional-Integral-Derivative Controller) 算法詳解及案例分析 目錄 PID控制器 (Proportional-Integral-Derivative Controller) 算法詳解及案例分析1. 引言2. PID控制器的基本概念2.1 PID控制器的定義2.2 PID控制器的核心思想2.3 PID控制器的應用領域3. PID控…

rtthread學習筆記系列(3) -- FINSH模塊

文章目錄 3. FINSH模塊3.1MSH3.1.1初始化3.1.1.1FSymtab段3.1.1.2 宏 3.1.2遍歷FINSH命令3.1.3TAB補全實現3.1.3.1 msh_auto_complete3.1.3.2 msh_opt_auto_complete 3.1.4 TAB 子選項自動補全 3.2 SHELL3.2.1 finsh_system_init分配finsh結構體使用內存3.2.2 finsh_thread_ent…

Redis 知識速覽

文章目錄 1. Redis 簡介2. Redis 優缺點3. Redis 高性能4. Redis VM 機制5. Redis 數據類型6. 應用場景7. 持久化8. 過期策略9. 內存相關10. 線程模型11. 事務12. 集群 1. Redis 簡介 定義&#xff1a;Redis 是一個用 C 語言編寫的高性能非關系型&#xff08;NoSQL&#xff09…

nginx-lua緩存機制

一. 簡述&#xff1a; 緩存是一個大型系統中非常重要的一個組成部分。在硬件層面&#xff0c;大部分的計算機硬件都會用緩存來提高速度&#xff0c;比如CPU會有多級緩存、RAID卡也有讀寫緩存。在軟件層面&#xff0c;我們用的數據庫就是一個緩存設計非常好的例子&#xff0c;在…

Java 面試中的高頻算法題詳解

&#x1f496; 歡迎來到我的博客&#xff01; 非常高興能在這里與您相遇。在這里&#xff0c;您不僅能獲得有趣的技術分享&#xff0c;還能感受到輕松愉快的氛圍。無論您是編程新手&#xff0c;還是資深開發者&#xff0c;都能在這里找到屬于您的知識寶藏&#xff0c;學習和成長…

【Python項目】手寫數字識別系統

【Python項目】手寫數字識別系統 技術簡介&#xff1a;采用Python技術、Django框架、MYSQL數據庫等實現。 系統簡介&#xff1a;手寫數字識別系統主要的功能有手寫字識別、手寫字管理、修改密碼、個人信息和用戶管理。 背景&#xff1a; 在當今這個飛速發展的時代&#xff0c;…

Springboot + vue 小區物業管理系統

&#x1f942;(???)您的點贊&#x1f44d;?評論&#x1f4dd;?收藏?是作者創作的最大動力&#x1f91e; &#x1f496;&#x1f4d5;&#x1f389;&#x1f525; 支持我&#xff1a;點贊&#x1f44d;收藏??留言&#x1f4dd;歡迎留言討論 &#x1f525;&#x1f525;&…

空指針:HttpSession異常,SpringBoot集成WebSocket

異常可能性&#xff1a; 404 &#xff1a; 請檢查攔截器是否將請求攔截WebSocket握手期間HttpSession為空 HttpSession為空 方法一 &#xff1a; 網上參考大量的文檔&#xff0c;有說跟前端請求域名有關系的。 反正對我來說&#xff0c;沒啥用無法連接。 需使用 localhost&a…

什么是視頻孿生智慧能源?視頻孿生智慧能源的應用案例

?視頻孿生智慧能源是集三維地理信息系統、視頻虛實融合、數字孿生、人工智能等多技術于一體的綜合應用&#xff0c;旨在實現對能源系統的實時、動態、全方位監控和管理?。 具體來說&#xff0c;視頻孿生智慧能源通過以下方式實現其功能&#xff1a; ?技術融合?&#xff1a;…