实现 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.mzph.cn/news/286684.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

0运维?微信小程序云开发增删查改【05】

在创建小程序时&#xff0c;选择云开发&#xff1a; 随后进入项目之后&#xff0c;此时整个目录如下&#xff1a; 此时我们如图目录即可找到首页位置&#xff1a; 接着咱们清除 index.wxml 代码内容&#xff1a; 在 index.wxml 中加入如下代码&#xff1a; <view> …

【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…

Android之实现夸克浏览器书签和历史页面滑动时候右上角图标切换效果

1 需求 实现夸克浏览器书签和历史页面滑动时候右上角图标切换效果,页面滑动的时候,图标也左右滑动,但是只是显示其中的一个 https://www.captainai.net/st/ 2 代码实现 xml布局实现 <LinearLayoutandroid:id="@+id/mainLl"android:layout_width="24d…

你都用 Python 来做什么?

你们都用python做些什么呢&#xff1f; 在开发中 python 这一个语言就像是小叮当&#xff0c;而 python 的第三方库则是“百宝箱”&#xff0c;你只要想着对某一个方向进行开发&#xff0c;那么这个“百宝箱”就会给你想要的东西。 由于我是在开发多年后接触到的 python&#…

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…

关于 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;只有通过网络跟外界进行数据交互、数据…

深入理解Three.js(WebGL)贴图(纹理映射)和UV映射

本文将详细描述如何使用Three.js给3D对象添加贴图&#xff08;Texture Map&#xff0c;也译作纹理映射&#xff0c;“贴图”的翻译要更直观&#xff0c;而“纹理映射”更准确。&#xff09;。为了能够查看在线演示效果&#xff0c;你需要有一个兼容WebGL的现代浏览器&#xff0…

在兰州吃牛肉面时亲眼目睹的一幕,我感动了

今天中午去吃占国牛肉面&#xff0c;人比较多&#xff0c;很热闹。旁边坐了一群身穿校服的小学生&#xff0c;身后坐着一位小学老师&#xff0c;当孩子们发现老师在后面的时候&#xff0c;都异口同声地叫老师过去跟他们一起吃&#xff0c;老师嘿的一笑&#xff0c;没同意&#…

如何跨 Namespace 同步 Secret 和 ConfigMap?

Secret 和 ConfigMap 资源对象是命名空间级别的。它们只能被同一命名空间中的 Pod 引用。所以有时候不得不手动为每个命名空间创建它们。但有很多场景&#xff0c;我们想让它们是全局的&#xff0c;至少可以是跨命名空间共享的 Secret 和 ConfigMap&#xff0c;例如这些场景&am…

一文总结学习 Python 的 14 张思维导图

本文主要涵盖了 Python 编程的核心知识&#xff08;暂不包括标准库及第三方库&#xff0c;后续会发布相应专题的文章&#xff09;。 首先&#xff0c;按顺序依次展示了以下内容的一系列思维导图&#xff1a;基础知识&#xff0c;数据类型&#xff08;数字&#xff0c;字符串&am…

GEE学习笔记

掩膜 ​ 在遥感图像处理中&#xff0c;"掩膜"是指一种用于隐藏或保留图像特定部分的技术。掩膜通常是一个二进制图像&#xff0c;其中的像素值为0或1&#xff0c;分别表示遮蔽或保留。 ​ 在去除云的情境中&#xff0c;掩膜通常用于隐藏图像中被云覆盖的部分&#…

十一、飞机大战(IVX 快速开发教程)

十一、飞机大战 制作微信小游戏大致流程与微信小程序、Web类似&#xff0c;不同的在于是组件的使用。 文章目录十一、飞机大战11.1.1 完成游戏角色制作11.1.2 完成物理世界添加11.1.3 完成子弹对象反重力运动11.1.4 使用对象组创建子弹11.1.5 子弹优化11.1.6 设置敌机11.1.7 优…

中国版LinkedIn呼之欲出

迄今为止&#xff0c;发展势头强劲的Facebook仍未上市&#xff0c;而美国职业社交网站LinkedIn 却率先登录纽约证券交易所&#xff0c;股价在第一天的交易中飙升&#xff0c;从45美元的发行价上涨了一倍&#xff0c;然后超过100美元&#xff0c;最终以94.25美元收盘。 LinkedIn…

Android之实现RecyclerView拖拽效果和固定部分元素不进行交换位置(包含源代码下载地址)

1、效果爆照 启动的效果 拖动过程中的效果 拖动后的效果 2、需求和问题 需求:RecyclerView实现拖拽效果,但是部分固定位置不能进行拖拽也不能在拖拽的过程中交换顺序

各主流浏览器内核介绍

所谓的“浏览器内核”无非指的是一个浏览器最核心的部分——“Rendering Engine”&#xff0c;直译这个词汇叫做“渲染引擎”&#xff0c;不过我们也常称其为“排版引擎”、“解释引擎”。这个引擎的作用是帮助浏览器来渲染网页的内容&#xff0c;将页面内 容和排版代码转换为用…

测绘地理信息标准(国家、行业、地方)大全来了:测绘地理信息标准化服务平台

测绘地理信息标准化服务平台&#xff0c;这里有你需要的所有标准&#xff0c;赶快来围观吧&#xff01;

WPF效果第一百八十七篇之再玩ListBox

大周末的接着上一篇又玩了ListBox,这不又来再次去玩耍ListBox;毕竟是我的最爱,没办法就喜欢玩耍他;闲话也不多扯了,直接看最终效果:2、ItemsPanel还是老样子:<ItemsPanelTemplate x:Key"CommonItemsPanelTemplate"><WrapPanel Orientation"Horizontal&…