EntityFramework Core查询数据基本本质

【导读】在EntityFramework Core中、当查询出数据后,是如何将数据映射给实体的呢?本节我们预先做个基本探讨,后续给出其底层原理本质

前不久,我们在探索性能时,给出利用反射达到性能瓶颈时的方案即使用委托,如下:

var setId = (Action<Test, int>)Delegate.CreateDelegate(typeof(Action<Test, int>), null, typeof(Test).GetProperty("Id").GetSetMethod());

上述我们通过委托方式来代替反射,可能我们也想到了另外一种方案,通过lambda构建表达式的方式

查询数据基本本质

首先我们来看看如何手动构建lambda表达式来获取或设置数据,废话不多讲,直接见代码

public static Action<T, object> Set<T>(PropertyInfo propertyInfo)
{var targetType = propertyInfo.DeclaringType;var setMethod = propertyInfo.GetSetMethod();var type = propertyInfo.PropertyType;var target = Expression.Parameter(targetType, "t");var value = Expression.Parameter(typeof(object), "d");var condition = Expression.Condition(Expression.Equal(value, Expression.Constant(DBNull.Value)),Expression.Default(type),Expression.Convert(value, type));var body = Expression.Call(Expression.Convert(target, setMethod.DeclaringType),setMethod,condition);return Expression.Lambda<Action<T, object>>(body, target, value).Compile();
}

当我们获取到数据库数据时,紧接着需要将其对应列数据赋值给对应属性,此时根据列类型需构建表达式判断条件(Condition),继而调用其设置方法,最后构建整体lambda进行编译执行,对于获取基本同理,不再解释

public static Func<T, object> Get<T>(PropertyInfo propertyInfo)
{var targetType = propertyInfo.DeclaringType;var getMethod = propertyInfo.GetGetMethod();var target = Expression.Parameter(targetType, "t");var body = Expression.Convert(Expression.Call(target, getMethod), typeof(object));return Expression.Lambda<Func<T, object>>(body, target).Compile();
}

那么问题来了,手动构建lambda表达式和上述直接通过创建委托方式,哪种方式更佳呢?

单从代码量上和所给例子来看,理论上是利用创建委托方式更佳,但是其潜在的问题是,通过创建委托,我们必须遍历实体所有属性,那么像上述利用lambda表达式难道就不用了?

事实上,完全不用,手动构建lambda的好处在于,我们可手动构建实体所有属性,然后一次性赋值从而改善性能

至于如何一次性获取对应实体所有属性,然后手动构建lambda并赋值,这才是EntityFramework Core的妙处设计所在,后续文章我会详细给出

手动构建lambda的场景很多,再比如构建自动化脚本,对lambda使用到炉火纯青地步,那么自身整体核心竞争力将更上一台阶

???? 是的,我的文章都是建立在基础上的一点额外探索,比如微服务、k8s等等流行的玩意当前还完全没有涉及,一来实际项目中,还未应用,二是,不愿浅尝辄止,意义不大。万变不离其宗,所有我们看过的代码难道不都是语法组合吗?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/304539.shtml

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

相关文章

pythonmt4通讯swot矩阵_swot分析矩阵范例(各部门)

优势(Strengths)S1.团队工作氛围和谐融洽&#xff0c;作风吃苦耐劳&#xff0c;积极主动、自我改进意识强S2.品质管控专业人才工作能力强、沟通能力强&#xff0c;执行力坚决S3.产品质量管控体制、流程健全&#xff0c;拥有质量监督管控权S4.产品检测、试验设备齐全&#xff0c…

2009从知到行知识管理培训公开课最后一期

由知识管理中心&#xff08;Knowledge Management Center&#xff09;举办的“从知到行&#xff1a;知识管理理论与实施”培训班第十六期将于2009年11月26-27日于北京举办&#xff0c;这也是KMC举办的2009年最后一期面向CKO、知识管理总监、经理和知识管理专员等知识管理实施人…

java socket 多次write_java NIO2异步socket的write事件与read事件的完成次数不一致是怎么回事...

引用来自“Black_JackQ”的评论异步的&#xff0c;client需多次read处理完数据。是这样做的&#xff0c;但是目前观察消息接受率只有70%左右&#xff0c;代码如下&#xff1a;socket.read(byteBuffer, null, new CompletionHandler() {Overridepublic void completed(Integer r…

万级 K8S 集群背后,etcd 如何保持稳定性?

这几年&#xff0c;随着 Kubernetes 成为容器编排领域霸主&#xff0c;etcd 越来越火&#xff0c;GitHub star 已超过 34.2K。这与它的应用场景广泛密不可分&#xff0c;从服务发现到分布式锁&#xff0c;从配置存储到分布式协调&#xff0c;可以说&#xff0c;etcd 已成为云原…

mysql 10分钟一聚合_SQL-根据DateTime查询多个聚合-MySQL

这是一个复杂的过程.但是我有一个表,其中包含一个DATETIME字段,以及一些其他的int和float字段,需要对其求和并求平均值.我们希望基于时间戳在此表上进行求和和平均,最终旨在开发3个在某种意义上可以相互补充的查询.所以能力看起来像这样TIMESTAMP |subj_diff| SCR2 | SCR32011-…

qdialog 只有点击才能获得焦点_4 个突破点,让你的 Banner 点击率提升10倍

双 11 刚过&#xff0c;双 12又来了每年这个时候作为一名设计师&#xff0c;真的很难...老板压着做电商 banner还有很多人指指戳戳让你改稿好不容易按照别人的想法过稿结果banner 的点击率还不高其实&#xff0c;只需要稍微调整视觉重点你的电商banner 就会变得变得更吸引人&am…

判断文件是否存在一个API函数

一、声明&#xff08;方式有两种&#xff09;: 1. functionPathFileExists(pszPath:string):Bool;stdcall;externalshlwapi.dllNamePathFileExistsA;2. functionPathFileExistsA(pszPath:string):Bool;stdcall;externalshlwapi.dll;二、使用&#xff08;此处用第二种方式&#…

穿背心的老院士,86岁,重病,还在敲代码,单手!

昨天有幸看到了一个视频&#xff0c;视频中&#xff0c;一位老先生穿着朴素的白背心&#xff0c;伏在桌上&#xff0c;对着电脑&#xff0c;一手按着写满密密麻麻数学公式的本子&#xff0c;另一只手仅用单指吃力又缓慢地按着键盘。老先生全神贯注地研究他是 “背心院士” 高伯…

百度广告点击软件_结束了,百度 “毒瘤” 广告!

“ 通过本文&#xff0c;你可以获取一款上网必备的插件&#xff0c;让你摆脱各种"毒瘤"广告。”大家天天逛网页&#xff0c;最恼人的也就是广告了吧。尤其是百度搜索时。01—毒瘤广告有多愁&#xff1f;百度广告有多可怕&#xff0c;小哥哥给你演示一下。百度搜“智齿…

java跳转画面后画面白了_如何跳转指定页面后再次跳转到另一页面或原来的页面...

c#图解教程第5版数万读者认可的新99.33元(需用券)去购买 >这里可以采用redirect以get形式向指定页面发出get请求&#xff0c;指定页面完成后会再次跳转到redirect后边指定的页面(注意&#xff1a;这里的redirect只是一个自定义参数&#xff0c;并不是自带的&#xff0c;名称…

用PHP实现POP3邮件的收取(一)

POP协议简介 本文简要说明了通过POP3协议收取邮件、MIME邮件的解码的原理&#xff1b;针对收取和MIME解码&#xff0c;提供了两个实用的PHP类&#xff0c;并提供了运用的样例。分为邮件收取、MIME解码两个部分。这里我们先向您介绍邮件的收取&#xff0c;解码部分会在以后的文章…

【基础数学知识】带你理解泰勒展开式本质

推荐阅读时间&#xff1a;5min~8min主要内容&#xff1a;更好的理解&#xff0c;并且记忆泰勒展开式我们学习泰勒展开&#xff0c;本质上就是为了在某个点附近&#xff0c;用多项式函数取近似其他函数。可能有些童鞋就要问了&#xff0c;既然有一个函数了&#xff0c;为什么还需…

C#使用NPOI进行word的读写

目录一、简介1、操作Word的类库&#xff1a;二、简单使用1、XWPFDocument类的实例化2、设置页面的大小3、段落处理4、表格处理5、页眉页脚处理三、综合示例四、参考一、简介1、操作Word的类库&#xff1a;二、简单使用1、XWPFDocument类的实例化该类的实例对应一个word文档XWPF…

weblogic修改控制台ip_「Weblogic学习」Weblogic知识要点之JNDI/JTA编程开发

给它一个名字&#xff0c;它就能提供你要的服务&#xff0c;JNDI就是这么地任性。想任性的霸占数据&#xff1f;JTA为你把风。这期&#xff0c;谈谈JNDI和JTA的简单介绍&#xff0c;一起看看吧……JNDI编程JNDI(Java Naming and Directory Interface)是SUN公司提供的一种标准的…

java不适合开发cv吗_JavaCV开发环境的配置

一.安装opencv2.4.4、测试运行OpenCV-2.4.4.exe&#xff0c;就是解压&#xff0c;把它解压到一个你喜欢的地方 ——1.1 路径最好不要太深&#xff0c;点啊点的最讨厌了2. 添加 ***\OpenCV2.4.4\build\x64\vc11\bin; 到环境变量的PATH后面 ——2.1 ***是你放OpenCV2.4.4的地方…

NA-NP-IE系列实验5:配置文件的备份和IOS 的备份

实验5:配置文件的备份和IOS 的备份<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />1. 实验目的通过本实验&#xff0c;读者可以掌握如下技能&#xff1a;&#xff08;1&#xff09; 熟悉TFTP 服务器的使用&#xff08;2&#xf…

浅析 Sunday 算法

背景Sunday 算法是 Daniel M.Sunday 于 1990 年提出的字符串模式匹配。其效率在匹配随机的字符串时比其他匹配算法还要更快。Sunday 算法的实现可比 KMP&#xff0c;BM 的实现容易太多。算法过程假定主串为 "HERE IS A SIMPLE EXAMPLE"&#xff0c;模式串为 "EX…

.NET 6 Preview 1发布!

喜欢就关注我们吧&#xff01;.NET 6 首个预览版已发布&#xff0c;官方表示 .NET 6 的核心目标是完成从 .NET 5 开始的 .NET 统一计划的最后部分。此版本还将对 .NET 整体进行重大改进&#xff0c;包括针对云、桌面和移动应用程序的改进。.NET 6 计划于2021年11月正式发布&…

vba cad 获取宏的路径_VBA批量创建文件目录及链接,建议收藏备用

小伙伴们&#xff0c;之前有跟大家分享过Power Query获取文件夹内文件清单及其属性的方法【Excel快速获取文件列表及文件属性】。今天教大家通过VBA代码来实现同样的功能&#xff0c;提取文件夹内的文件信息更加灵活&#xff0c;只要选择对应的文件夹即可。实现效果操作方法&am…

纯JDBC系统的开发随想

纯JDBC系统的开发随想前两天&#xff0c;两个个纯后台应用项目在没有充分论证的情况下使用了SpringiBatis实现&#xff0c;从需求到实现、测试历经两天时间&#xff0c;实际代码开发时间是8小时&#xff0c;时间比较短&#xff0c;因为有以前的代码积累。再加上对框架熟烂于心&…