查缺補漏系統學習 EF Core 6 - 原始 SQL 查詢

推薦關注「碼俠江湖」星標,時刻不忘江湖事

這是 EF Core 系列的第五篇文章,上一篇文章盤點了 EF Core 中的幾種數據查詢方式。

但是有有時候,我們可能無法用標準的 LINQ 方法完成查詢任務。

或者編譯后的 LINQ 查詢,沒有我們想要的那么高效;又或者我們想要調用一個存儲過程。

這些情況下,我們希望可以編寫原始 SQL 語句,讓 EF Core 去執行。

因此,這篇文章就簡要的講一講如何在 EF Core 中使用原始 SQL 語句進行查詢。

點擊上方或后方藍字,閱讀 EF Core 系列合集。

ad3127b697bef6a9395571b2f7662d7d.png

FromSqlRaw

讓我們來看一個簡單的示例:

var?account?=?_context.Accounts.FromSqlRaw(@"SELECT?*?FROM?Account?WHERE?Name?=?{0}",?"Zilor").FirstOrDefault();

FromSqlRaw 方法允許我們將原始 SQL 語句,添加到 EF Core 查詢中。

還可以執行存儲過程:

var?account?=?_context.Accounts.FromSqlRaw("EXECUTE?dbo.MyCustomProcedure").ToList();

需要注意的是 FromSqlRaw 方法有一些限制:

  • 結果中的列名,必須與屬性被映射到的列名相匹配

  • 查詢必須為實體或查詢類型的所有屬性返回數據

  • SQL 查詢不能包含導航關系,但我們總是可以把 FromSqlRawInclude 方法結合起來。

如果想在查詢中包含導航關系,可以這樣做:

var?account?=?_context.Accounts.FromSqlRaw("SELECT?*?FROM?Account?WHERE?Name?=?{0}",?"Zilor").Include(e?=>?e.AccountSubjects).FirstOrDefault();

ExecuteSqlRaw

FromSqlRaw 可以執行原始 SQL 語句查詢,但不能執行插入、刪除、更新等 SQL 語句,這需要使用 ExecuteSqlRaw 方法實現,比如這樣:

var?rowsAffected?=?_context.Database.ExecuteSqlRaw(@"UPDATE?AccountSET?Age?=?{0}?WHERE?Name?=?{1}",20,?"Zilor");

這個方法會返回受影響的行數,無論是從數據庫中更新、插入還是刪除記錄,行為都一樣。

需要注意是,這里我們使用了 Database 屬性,來調用 ExecuteSqlRaw 方法

而在之前的例子中,我們都是使用 Account 屬性,來調用 FromSqlRaw 方法。

另一件重要的事情是,我們在 FromSqlRawExecuteSqlRaw 方法中,都使用了查詢字符串插值功能。

它允許我們在查詢字符串中放置一個變量名,然后 EF Core 會檢查這些參數。

檢查參數的目的,是為了以防止 SQL 注入攻擊。

因此,我們不能在 EF Core 原始 SQL 查詢方法之外,使用字符串插值組裝 SQL 語句。因為,這樣會失去 SQL 參數注入攻擊的檢測。

雖然直接執行 SQL 語句的方式比較直接,但缺點就是在代碼中直接操作數據庫的方式,不符合 ORM 的編程模式與思想。

如果我們直接操作數據庫表,那么就無法利用 EF Core 強類型的特性。

如果實體模型發生改變,那么必須手動變更 SQL 語句。

而且如果調用了一些某些數據庫特有的語法和函數,那么一旦程序遷移到其他數據庫,就可能需要重新編寫 SQL 語句。

這樣也就無法利用 EF Core 強大的 SQL 翻譯機制,來屏蔽不同底層數據庫的差異。

所以,在能不用的情況下,最好不要使用執行原生 SQL 語句的功能。

重新加載

假設我們有一個已經加載的實體,然后使用 ExecuteSqlRaw 方法,對數據庫中的實體做了一些修改,那此時我們加載的實體肯定是過時。

比如這樣:

var?accountForUpdate?=_context.Accounts.FirstOrDefault(s?=>?s.Name.Equals("Zilor"));var?rowsAffected?=_context.Database.ExecuteSqlRaw(@"UPDATE?AccountSET?Age?=?{0}WHERE?Name?=?{1}",22,?accountForUpdate.Name);

只要我們執行這個查詢,數據庫中的 Age 就會變成 22

accountForUpdate 對象中的 Age 屬性則不會改變,盡管它在數據庫中已經被改變了。

所以,現在的問題是,如果我們想讓它在執行 ExecuteSqlRaw 方法后,實體對象的值隨之改變,該怎么辦?。

其實很簡單,我們只需要在 SQL 語句執行完成后,使用 Reload 方法重新加載這個實體即可:

_context.Entry(accountForUpdate).Reload();

小結

這篇文章主要講了 EF Core 的原始 SQL 語句查詢,下篇文章講繼續講述 EF Core 的數據修改。

更多精彩內容,請關注我▼▼

d57f0aa5902b080818a6a69a719e0367.gif

如果喜歡我的文章,那么

在看和轉發是對我最大的支持!

(戳下面藍字閱讀)

cfb043d8f4ee97c7a651363729800a5a.png

推薦關注微信公眾號:碼俠江湖

? ? ? ? ? ? ? ? ? ? ? ??e8b9f958f0896b793d9b75c2038278ab.png覺得不錯,點個在看再走喲

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

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

相關文章

【python opencv 計算機視覺零基礎到實戰】二、 opencv文件格式與攝像頭讀取

一、學習目標 了解圖片的結構屬性了解如何捕獲視頻了解waitkey的使用方法 目錄 [python opencv 計算機視覺零基礎到實戰] 一、opencv的helloworld [【python opencv 計算機視覺零基礎到實戰】二、 opencv文件格式與攝像頭讀取] 一、opencv的helloworld [[python opencv 計…

python冒泡排序代碼完整_用Python寫冒泡排序代碼

python代碼實現冒泡排序代碼其實很簡單,具體代碼如下所示:代碼Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> 1 def bubbleSort(numbers):for j in xrange(len(numbers),-1,-1):for i in xra…

[C++]VS2005(VC8) 使用 Boost

測試環境:[1] Widnows XP Professional[2] Visual Studio 2005 Team Studio(VC8.0)[3] WinCvs 1.31. 下載 Boost透過 CVS 下載最新版 cvs -d:pserver:anonymousboost.cvs.sourceforge.net:/cvsroot/boost login [詢問密碼時,直接輸入 Enter 略過] cvs …

Android之編譯提示error: Apostrophe not preceded by

1 問題 as編譯提示錯誤如下 error: Apostrophe not preceded by 2 原因 字符串資源文件里面value包含一個單引號 <string name"key">Don t ....</string> 2 解決辦法 1) 加雙引號 <string name"key">"Don t ...."</s…

【ArcObject開發】實驗:ArcGIS Desktop開發方式入門基礎教程

一、實驗目的: 熟練掌握ArcGIS Desktop開發方式。 二、實驗準備: 學習ArcGIS Desktop定制步驟;熟悉VBA編程環境、Active DLL和Active EXE開發一般過程。 三、實驗內容: (1)描述在ArcGIS Desktop環境下定制窗體界面的一般步驟;(2)在VBA環境下編寫宏,實現圖層視圖…

C# WPF后臺動態添加控件(經典)

概述在Winform中從后臺添加控件相對比較容易&#xff0c;但是在WPF中&#xff0c;我們知道界面是通過XAML編寫的&#xff0c;如何把后臺寫好的控件動態添加到前臺呢&#xff1f;本節舉例介紹這個問題。這里要用到UniformGrid布局&#xff0c;UniformGrid 是一種橫向的網格分割、…

Android Button監聽的方式

Android Button的幾種監聽方式 1、一個Button對應一個監聽 1&#xff09;xml文件中綁定監聽 <Buttonandroid:id"id/btn_test"android:layout_width"match_parent"android:layout_height"wrap_content"android:text"test listener"a…

hdu 5441 (并查集)

題意&#xff1a;給你n個點&#xff0c;m條邊構成無向圖。q個詢問&#xff0c;每次一個值&#xff0c;求有多少條路&#xff0c;路中的邊權都小于這個值 a->b 和 b->a算兩種 思路&#xff1a;把權值從小到大排序&#xff0c;詢問從小到大排序&#xff0c;如果相連則用并查…

【Envi風暴】Envi 5.4遙感影像鑲嵌原來如此簡單!

圖像鑲嵌指是在一定的數學基礎控制下,把多景相鄰的遙感圖像拼接成一個大范圍、無縫圖像的過程。 Envi的圖像鑲嵌功能提供交互式的方式將沒有地理坐標或者地理坐標的多幅圖像合并,生成一幅單一的合成圖像。鑲嵌功能提供了透明處理、勻色、羽化等功能。 下面演示基于地理坐標(…

[python opencv 計算機視覺零基礎到實戰] 三、numpy與圖像編輯

一、學習目標 了解圖片的通道與數組結構了解使用numpy創建一個圖片了解使用numpy對圖片的一般操作方法 目錄 [python opencv 計算機視覺零基礎到實戰] 一、opencv的helloworld [【python opencv 計算機視覺零基礎到實戰】二、 opencv文件格式與攝像頭讀取] 一、opencv的hel…

java 常用類庫_JAVA(三)JAVA常用類庫/JAVA IO

成鵬致遠 |lcw.cnblog.com|2014-02-01JAVA常用類庫1.StringBufferStringBuffer是使用緩沖區的&#xff0c;本身也是操作字符串的&#xff0c;但是與String類不同&#xff0c;String類的內容一旦聲明之后則不可改變&#xff0c;改變的只是其內存地址的指向&#xff0c;而StringB…

Error: package or namespace load failed for ‘rJava’:

https://stackoverflow.com/questions/30738974/rjava-load-error-in-rstudio-r-after-upgrading-to-osx-yosemite 安裝好的“xlsx”不能正常加載 library("xlsx") 報錯&#xff1a; 載入需要的程輯包&#xff1a;rJava Error: package or namespace load failed for…

Android之國際化部分文字生效而部分文字沒有生效的坑

1 問題 Android國際化我們知道只要在res目錄下面&#xff0c;創建不同國家的文件夾然后&#xff0c;把不同國家對于的語言以鍵值對的方式寫進strings.xml文件就行&#xff0c;這是一個非常簡單的操作&#xff0c;但是今天遇到了一個很奇葩的問題&#xff0c;在部分手機&#x…

【中間件】c#/.net使用GZY.Quartz.MUI搭建可視化的定時任務面板

GZY.Quartz.MUI是在github上開源的aspnetcore項目, 它旨在幫助開發人員通過面板來設置定時任務&#xff0c;主要想做的就是:像swaggerUI一樣,項目入侵量小,僅需要在Startup中注入的UI組件官方地址:https://www.cnblogs.com/GuZhenYin/p/15745002.html主要功能1.增加本地json持久…

Python學習筆記之字典

一、創建和使用字典 1、創建字典 phonebook{Alice:2341,Beth:9102,Cecil:3258} 2、dict,通過映射創建字典 >>> items[(name,Gumby),(age,34)] >>> ddict(items) >>> d 顯示&#xff1a;{name:Gumby,age:34} dict&#xff0c;通過關鍵字創建字典 >…

iOS UI基礎-7.0 UIScrollView

概述 移動設備的屏幕大小是極其有限的&#xff0c;因此直接展示在用戶眼前的內容也相當有限.當展示的內容較多&#xff0c;超出一個屏幕時&#xff0c;用戶可通過滾動手勢來查看屏幕以外的內容,普通的UIView不具備滾動功能&#xff0c;不能顯示過多的內容。UIScrollView是一個能…

【ArcGIS風暴】緩沖區分析、疊置分析綜合實驗案例:購房區域的選擇

實驗平臺:ArcGIS 9.3實驗目的:熟練掌握A rcGIS緩沖區分析和疊置分析操作,綜合利用各項空間分析工具解決實際問題。實驗要求:對每個條件進行緩沖區分析,運用空間疊置分析對多個圖層疊加,并分等級,確定合適的區域。實驗數據:ArcEx8實驗步驟打開ArcMap,加載數據ArcEx8,如…

[python opencv 計算機視覺零基礎到實戰] 四、了解色彩空間及其詳解

一、學習目標 了解什么是色彩空間了解opencv中色彩空間的轉換 目錄 [python opencv 計算機視覺零基礎到實戰] 一、opencv的helloworld [【python opencv 計算機視覺零基礎到實戰】二、 opencv文件格式與攝像頭讀取] 一、opencv的helloworld [[python opencv 計算機視覺零基…

java gui 按鍵 數組_java GUI分配數組值

好的,所以這是一個非常基本的例子.它需要更多的工作和優化,但應該讓你朝著正確的方向前進import java.awt.Color;import java.awt.Dimension;import java.awt.EventQueue;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.Point;import java.awt.Shape;im…

Android之如何實現阿拉伯版本(RTL)的recycleView的網格布局

1 問題 比如正常的recycleView的網格布局效果如下 1 2 34 5 67 8 現在需要變成這樣的效果 3 2 16 5 48 7 2 思考過程和嘗試解決方法 1)從recycleView上直接分析,看有沒有相關的方法變成這個格式,網上百度了,基本上找不到 2)既然recycleView里面有常見的幾種布局設置,…