当前位置: 首页 > news >正文

投影投影接口定义

投影接口定义

  • IProjection接口很简单
  • 只有TryConvert一个方法
  • 相同类型对象的转化,返回是否成功以及转化后的结果
  • 约定不符合规则就不转化
  • 一般情况下转化成功的结果会和源对象不同
  • 当然经过多次投影后也可能会和源对象相同了
public interface IProjection<T> { bool TryConvert(T source, out T result); }

2. 三种投影方式

2.1 使用前缀投影来演示
  • 前缀投影就是把成员前面加个前缀来映射
  • sourceMembers模拟对User的反射
  • 通过Projection.Prefix("User")创建一个前缀投影
  • 如果没有User前缀,就增加User
  • 如果有User前缀就不处理
public record User(int Id, string UserName); public record UserDTO(int UserId, string UserName); var sourceMembers = new Dictionary<string, Func<User, object>>() { [nameof(User.Id)] = obj => obj.Id, [nameof(User.UserName)] = obj => obj.UserName }; var projection = Projection.Prefix("User");
2.2 Filter投影的Case
2.2.1 csharp代码
IDictionary<string, Func<User, object>> result = projection.Filter(sourceMembers); Assert.Single(result); Assert.True(result.ContainsKey(nameof(UserDTO.UserId)));
2.2.2 sql表示
SELECT Id AS UserId FROM User
2.2.3 影像表示

User

Filter

Id

UserName

UserId

2.3 Through投影的Case
2.3.1 csharp代码
IDictionary<string, Func<User, object>> result = projection.Through(sourceMembers); Assert.Equal(sourceMembers.Count, result.Count); Assert.True(result.ContainsKey(nameof(UserDTO.UserId))); Assert.True(result.ContainsKey(nameof(UserDTO.UserName)));
2.3.2 sql表示
SELECT Id AS UserId,UserName FROM User
2.3.3 影像表示

User

Through

Through

Id

UserName

UserId

UserName

2.4 Cross投影的Case
  • PocoEmit.Mapper重构用的就是Cross投影
2.4.1 csharp代码
IDictionary<string, Func<User, object>> result = projection.Cross(sourceMembers); Assert.Equal(3, result.Count); Assert.True(result.ContainsKey(nameof(User.Id))); Assert.True(result.ContainsKey(nameof(UserDTO.UserId))); Assert.True(result.ContainsKey(nameof(UserDTO.UserName)));
2.4.2 sql表示
SELECT Id,UserName,Id AS UserId FROM User
2.4.3 影像表示

User

Cross

Cross

Cross

Id

UserName

Id

UserName

UserId

3. 投影支持"横向"扩展

  • 这里说的"横向"就是投影并联
  • 把多个投影组合成多分支的映射规则
  • 通过FirstReturn或ToFirstReturn方法实现
3.1 "横向"扩展的Case
// 包含User或U前缀就去掉前缀 var user = Projection.RemovePrefix("User"); var u = Projection.RemovePrefix("U"); var projection = Projection.FirstReturn(user, u); [Theory] [InlineData("UserId", "Id")] [InlineData("UId", "Id")] [InlineData("UUserName", "UserName")] [InlineData("UserUName", "UName")] public void TryConvert(string source, string expected) { projection.TryConvert(source, out var result); Assert.Equal(expected, result); }
3.2 影像表示"横向"扩展
  • RemoveUser和RemoveU两个并联的投影
  • 并联投影按照顺序依次尝试
  • 直到有一个投影成功了就返回结果

expected

source

RemoveUser

RemoveU

RemoveU

RemoveUser

UserId

UId

UUserName

UserUName

Id

UserName

UName

二、投影在PocoEmit.Mapper中的应用

1. AddPrefix

1.1 AddPrefix的Case
IMapper mapper = Mapper.Create(); mapper.ConfigureMap<AutoUserDTO, User>() .Source .AddPrefix("User"); var source = new AutoUserDTO { UserId = "222", UserName = "Jxj2" }; var converter = mapper.GetConverter<AutoUserDTO, User>(); var result = converter.Convert(source); Assert.NotNull(result); Assert.Equal(source.UserId, result.Id.ToString()); Assert.Equal(source.UserName, result.UserName);
1.2 AddPrefix使用的是去除前缀投影(RemovePrefix)
  • AddPrefix("User")会调用Projection.RemovePrefix("User")来创建一个去除前缀投影
  • AutoUserDTO两个成员分别是UserId和UserName
  • User两个成员分别是Id和UserName
  • 对AutoUserDTO投影的效果相当于sql: SELECT UserId,UserName,UserId AS Id FROM AutoUserDTO
  • 通过这个投影,两边的成员名就能完美匹配上了
1.3 影像演示一下这个过程

User

AutoUserDTO投影

AutoUserDTO

RemoveUser

RemoveUser

Mapping

Mapping

UserId

UserName

UserId

UserName

Id

Name

Id

UserName

1.4 使用前缀投影(Prefix)也可以实现类似的效果
  • 通过Projection.Prefix("User")创建一个前缀投影
  • 这时就需要对User进行投影
  • 对User投影的效果相当于sql: SELECT Id,UserName,Id AS UserId FROM User
http://www.jsqmd.com/news/1076532/

相关文章:

  • 矫平机的辊系结构为什么这样设计从受力原理看二、四与六重的差异
  • Kimi K2.5实测:长文本解析与中文语义理解能力深度评测
  • 动态规划与蒙特卡洛实战对比:Gridworld从零手写DP策略迭代和MC控制
  • 从UI设计稿到工程代码,聊聊2026年AI设计工具的真实使用感受
  • HACS集成配置手册:Home Assistant社区商店实用指南
  • 【2013-10-17】Android应用开发笔记:自定义控件实现LCD显示
  • AI写论文攻略!4款AI论文生成工具,为你的毕业论文保驾护航!
  • MCP协议深度解析:从原理到实战,打造你的第一个AI工具集成
  • PX4神经网络控制技术在电力巡检无人机中的架构设计与工程实践
  • 微信机器人开发底座的数字化信任重构
  • 神经网络优化算法:从梯度下降到生物启发方法
  • 药品追溯码扫码设备怎么选?医药全场景读码硬件技术选型分析
  • 大模型和搜索引擎到底有什么不一样
  • 故障、机型、距离、负载四维联动,看懂智能派工人员匹配机制
  • 一次函数、一元一次方程不分家,是单层平直螺旋生长轨迹的两种观测表达-《全域数学vs传统数学:人类文明进阶200讲》第42讲 中学通俗版逐字稿
  • Playwright自动化测试:智能等待与页面导航的核心机制与实践
  • Agent-Reach部署教程:构建稳定Agent工作流环境
  • Hotkey Detective:Windows热键冲突终极解决方案完全指南
  • 虚拟助手化技术对话管理系统与多轮对话设计
  • 用友GRP-U8 SQL注入漏洞复现:从手工注入到自动化工具实战
  • ECJ5051-325D02自行车尾灯芯片 低功耗多模式LED警示灯玩具量产方案
  • 【原创保姆级】OpenAI Codex 全平台安装配置教程(Windows/Mac)避坑完整版
  • 准确率、精确率、召回率和 F1 到底怎么看?
  • IDM激活脚本完整指南:3步实现永久免费下载加速方案
  • 搜狗输入法,三步变干净
  • RoI Align 的提出和思想#
  • 【IDEA安装黑盒解密】:基于JetBrains官方源码级文档(v2024.1.3 Build #IU-241.14494.242)还原安装流程与签名验证机制
  • 3步免费解锁Microsoft 365完整功能:终极Office激活钩子工具详解
  • 3步轻松搞定知网文献批量下载:告别繁琐手动操作的高效方案
  • 终极网盘下载加速指南:LinkSwift直链助手让文件传输飞起来