實現 EF Core 6 自定義查詢標記

前言

在《EF Core使用Simple Logging輸出日志》中,我們介紹了查詢標記 TagWith,它可以幫助我們快速定位到需要的日志:

而在 .NET 6 中,新增了另外一個查詢標記 TagWithCallSite,它可以標記出代碼的位置:

var?user?=?await?new?DefaultDbContext().User.Where(p?=>?p.Name?==?"My?IO").TagWith("Find?My?IO").TagWithCallSite().FirstOrDefaultAsync();

c89808b992c1f1ac25676f2d09611767.png

那它是怎么做到的呢?

原理探究

查看 TagWithCallSite 的源代碼:

public?static?IQueryable<T>?TagWithCallSite<T>(this?IQueryable<T>?source,[NotParameterized]?[CallerFilePath]?string??filePath?=?null,[NotParameterized]?[CallerLineNumber]?int?lineNumber?=?0)

原來,它使用了 CallerFilePathAttributeCallerLineNumberAttribute 來獲取包含調用方的源文件完整路徑和調用方法的行號。

原理利用

這讓我們想到了,在《.NET 6新特性試用 | ArgumentNullException衛語句》中發現的 CallerArgumentExpressionAttribute,它可以獲取執行的表達式。

通過添加此 Attribute,我們可以創建自己的自定義查詢標記。實現代碼如下:

public?static?IQueryable<T>?TagWithCallInfo<T>(this?IQueryable<T>?source,string??tag?=?null,[NotParameterized][CallerArgumentExpression("source")]?string??argument?=?null,[NotParameterized][CallerMemberName]?string??memberName?=?null,[NotParameterized][CallerFilePath]?string??filePath?=?null,[NotParameterized][CallerLineNumber]?int?lineNumber?=?0)
{var?stringBuilder?=?new?StringBuilder();stringBuilder.AppendLine(tag);foreach?(var?str?in?argument.Split(Environment.NewLine,?StringSplitOptions.RemoveEmptyEntries)){stringBuilder.AppendLine(str);}stringBuilder.AppendLine($@"at?{memberName}");stringBuilder.AppendLine($@"File:?{filePath}:{lineNumber}");return?source.TagWith(stringBuilder.ToString());
}

該方法不僅包含自定義標記文本,還自動包括了被調用的 LINQ 查詢表達式、方法名稱、文件路徑、行號。

Demo

運行下列代碼進行驗證,完全滿足了我們的要求:

var?user?=?await?new?DefaultDbContext().User.Where(p?=>?p.Name?==?"My?IO")????.TagWithCallInfo("Find?My?IO").FirstOrDefaultAsync();

0b482720f15980857720157caa5576fa.png

結論

今天,通過擴展 TagWithCallSite ,我們實現了自定義查詢標記。

添加微信號【MyIO666】,邀你加入技術交流群

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

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

相關文章

LeetCode: 14. Longest Common Prefix

Write a function to find the longest common prefix string amongst an array of strings. 大意就是&#xff0c;寫一個函數可以找到一個數組字符串中的最長前綴。 分析&#xff1a; 最長前綴的最大值為數組字符串中長度最短的字符&#xff0c;由最短字符串由后向前遞減可以得…

jQuery選擇器和選取方法

我們已經使用了帶有簡單Css選擇器的jQuery選取函數:$()。現在是時候深入了解jQuery選擇器語法&#xff0c;以及一些提取和擴充選中元素集的方法了。 一、jQuery選擇器 在CSS3選擇器標淮草案定義的選擇器語法中&#xff0c;jQuery支持相當完整的一套子集&#xff0c;同時還添加了…

0運維?微信小程序云開發增刪查改【05】

在創建小程序時&#xff0c;選擇云開發&#xff1a; 隨后進入項目之后&#xff0c;此時整個目錄如下&#xff1a; 此時我們如圖目錄即可找到首頁位置&#xff1a; 接著咱們清除 index.wxml 代碼內容&#xff1a; 在 index.wxml 中加入如下代碼&#xff1a; <view> …

Android之解決卸載app后再次安裝提示room數據庫錯誤

1、問題 目前只有一個google手機之前安裝了app,里面有room寫的數據庫&#xff0c;后面把app卸載了&#xff0c;再次安裝新的app(修改了數據庫里面的字段)&#xff0c;啟動奔潰。 2、分析 提示數據庫錯誤&#xff0c;很明顯就像以前的app里面的數據庫沒有刪除一樣&#xff0c;…

【Microstation】第三章:Microstation三維模型構建與編輯

本章主要講述三維基本實體繪制、三維構造元素繪制、三維模型編輯。 一、三維基本體素繪制 對于立方體、圓柱、球、圓錐等這些基本立體單位,MS提供了專門的繪圖工具。 基本體素繪制有兩種方式: (1)精確繪圖工具 (2&

文件系統管理相關命令

查看文件系統相關屬性的命令&#xff1a;blkidblkid是一個查看磁盤設備屬性相關信息的命令行工具blkid -L LABEL | UUID :根據UUID查看對應的設備是哪個blkid [-ghlv] [-c file] [-w file] [-o format][-s tag] [-t NAMEvalue] device [device ...]-i&#xff1a;顯示io限制lsb…

CSharpFunctionalExtensions -函數式編程C#的功能擴展

簡介該庫有助于以更實用的方式編寫代碼安裝在NuGet上可用dotnet add package CSharpFunctionalExtensions或者PM> Install-Package CSharpFunctionalExtensions例子Maybe創建一個值Maybe<string> apple Maybe<string>.From("apple");// orMaybe<s…

Android之實現夸克瀏覽器書簽和歷史頁面滑動時候右上角圖標切換效果

1 需求 實現夸克瀏覽器書簽和歷史頁面滑動時候右上角圖標切換效果,頁面滑動的時候,圖標也左右滑動,但是只是顯示其中的一個 https://www.captainai.net/st/ 2 代碼實現 xml布局實現 <LinearLayoutandroid:id="@+id/mainLl"android:layout_width="24d…

ArcGIS 10.6字段計算器(Field Calculator)字段任意填充編碼序列(奇數、偶數序列、自定義間隔)

有關ArcGIS 10.x中屬性數據采集和字段計算器(Field Calculator)的文章,需要的讀者可以參照: 《ArcGIS實驗教程——實驗四:數字化屬性數據的采集》,文章中就屬性數據采集的多種方式做了說明,其中就有字段計算器的詳細說明;《【ArcGIS風暴】ArcGIS 10.2字段計算器(Field…

你都用 Python 來做什么?

你們都用python做些什么呢&#xff1f; 在開發中 python 這一個語言就像是小叮當&#xff0c;而 python 的第三方庫則是“百寶箱”&#xff0c;你只要想著對某一個方向進行開發&#xff0c;那么這個“百寶箱”就會給你想要的東西。 由于我是在開發多年后接觸到的 python&#…

DOS分區概述

雖然很多參考文檔對DOS分區進行介紹&#xff0c;但一直沒有一個統一的標準&#xff0c;也沒有統一的命名規則。Microsoft將使用DOS分區體系的磁盤稱為“主引導記錄(Master Boot Recorder---MBR)磁盤”&#xff0c;這是相對于使用“全局ID分區表(GUID Partition Table---GPT)磁盤…

pdf.js 利用HTML5技術顯示pdf內容

Mozilla實驗室最近在github上開源了一款js庫pdf.js&#xff0c;用來讀取PDF文件。 http://mozilla.github.io/pdf.js/ Using base64 encoded PDF HTML頁面內容 <script src"//mozilla.github.io/pdf.js/build/pdf.js"></script><h1>PDF.js Hell…

.NET 對于構建系統應用的探索歷程

這篇文章介紹和梳理一下截止到 2022 年的 .NET 向系統編程探索的歷程。2003 年的 Singularity 項目試圖讓 Windows 的內核態與用戶態應用完全建立在 .NET 托管世界上&#xff0c;并試驗了一個支持編譯到本機代碼的類似 C# 的語言&#xff0c;并發布了很多相關的論文。后來 Sing…

Android之tint圖片著色器

1、爆照 上面是原圖,下面是點擊效果。 2、介紹 設置著色模式用的。這個模式共有6種,分別為: multiply screen src_in(默認) src_over src_atop add android:tint 屬性可以改變圖片顏色 3 源代碼 colors.xml <?xml version="1.0" encoding="utf-8&qu…

完美解決ArcGIS10.x柵格空間插值報錯無法進行和導出插值柵格結果出錯的問題

不少GISer,尤其是初學者,對柵格數據的操作,主要是柵格插值無法進行,或者是插值后的柵格結果無法導出,或者導出結果為空,或者是柵格格式無法轉換,今天劉一哥GIS就幫您排憂解難吧。 其實,關于柵格(尤其是ESRI GRID格式)問題,我們只需要要記住兩點,一般問題就可以迎刃…

關于 Oracle分頁數據重復的問題

2019獨角獸企業重金招聘Python工程師標準>>> 先說問題吧。最近在測試一個新的模塊&#xff0c;發現列表數據的前三頁數據竟然是一樣的。第一反應是 pageNo 的問題&#xff0c;debug一看&#xff0c;pageNo是正確的&#xff0c;然后一層層debug下去&#xff0c;所有參…

10分鐘做一個新聞問答web站點[iVX低代碼實戰]

一、創建首頁 進入到iVX線上編輯器后&#xff0c;選擇相對定位。 點擊創建后進入到 IDE 之中&#xff1a; 我們在第一步中首先創建一個首頁。點擊左側組件欄中的頁面組件&#xff0c;創建一個頁面&#xff1a; 接著重命名該頁面為Home&#xff0c;在頁面中創建一個行&#x…

iOS開發網絡篇—網絡編程基礎

一、為什么要學習網絡編程 1.簡單說明 在移動互聯網時代&#xff0c;移動應用的特征有&#xff1a; &#xff08;1&#xff09;幾乎所有應用都需要用到網絡&#xff0c;比如QQ、微博、網易新聞、優酷、百度地圖 &#xff08;2&#xff09;只有通過網絡跟外界進行數據交互、數據…

PDF.js開發筆記

PDF.js是一個由HTML5建立的PDF閱讀器。依托開源社區驅動和Mozilla實驗室的技術支持。目標是建立一個通用的&#xff0c;基于web的解析和渲染PDF文件的平臺。https://github.com/ChineseDron/pdf.js# 是從Mozilla原版中fork出來的一個版本&#xff0c;原版的鏈接在這里https://g…

深入理解Three.js(WebGL)貼圖(紋理映射)和UV映射

本文將詳細描述如何使用Three.js給3D對象添加貼圖&#xff08;Texture Map&#xff0c;也譯作紋理映射&#xff0c;“貼圖”的翻譯要更直觀&#xff0c;而“紋理映射”更準確。&#xff09;。為了能夠查看在線演示效果&#xff0c;你需要有一個兼容WebGL的現代瀏覽器&#xff0…