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

记录复现多模态大模型论文OPERA的一周工作藕

一、简化查询

1. 先看一下查询的例子

///

/// 账户获取服务

///

///

///

public class AccountGetService(AccountTable table, IShadowBuilder builder)

{

private readonly SqlSource _source = new(builder.DataSource);

private readonly IParamQuery _accountQuery

= builder.BuildResult(

table.ToQuery()

.And(account => account.Id.Equal())

.ToSelect()

.SelectSelfColumns()

);

///

/// 获取账户

///

///

///

///

public Task GetAsync(Account param, CancellationToken token = default)

=> _accountQuery.GetFirstAsync(_source, param, token);

}

2. 调用方式如下

var account = await accountGetService.GetAsync(new Account { Id = 1L });

3. 这个例子我们可以简化一下

参数直接使用Id(类型由Account简化为long)

很大一部分数据库操作都只有一个参数(GetById、GetByName等)

为此定义一个含单个属性类有点浪费

按上面的例子使用实体类作为参数也感觉怪怪的

DBShadow.net支持这种简化操作

单个参数无需封装,直接使用参数类型即可

public class AccountGetService(AccountTable table, IShadowBuilder builder)

{

private readonly SqlSource _source = new(builder.DataSource);

private readonly IParamQuery _accountQuery

= builder.BuildResult(

table.ToQuery()

.And(account => account.Id.Equal())

.ToSelect()

.SelectSelfColumns()

);

public Task GetAsync(long accountId, CancellationToken token = default)

=> _accountQuery.GetFirstAsync(_source, param, token);

}

var account = await accountGetService.GetAsync(1L);

4. 特别注意不要在Dapper中这样使用

Dapper是不支持这种简化操作

以下Dapper错误示例会抛出异常

System.InvalidOperationException:“Must add values for the following parameters: @Id”

await using var conn = _dataSource.CreateConnection();

var sql = "SELECT \"Id\",\"Title\",\"Content\",\"Done\",\"LastTime\" FROM \"Todo\" WHERE \"Id\"=@Id";

var first = await conn.QueryFirstOrDefaultAsync(sql, 1L);

二、 集合参数也支持简化操作

1. IN查询简化的例子

In的参数名是可选和前面例子的Equal是一样的,默认字段名

In查询的实参支持数组、集合及字典

只有In一个集合参数时支持直接传数组、集合或字典

这时参数名(eg: AccountIds)就无所谓取什么名了

因为不需要按参数名反射获取属性了

///

/// 批量账户获取服务

///

///

///

public class AccountBatchService(AccountTable table, IShadowBuilder builder)

{

private readonly SqlSource _source = new(builder.DataSource);

private readonly IParamQuery _accountQuery

= builder.BuildResult(

table.ToQuery()

.And(account => account.Id.In("AccountIds"))

.ToSelect()

.SelectSelfColumns()

);

///

/// 批量获取账户

///

///

///

///

public IAsyncEnumerable GetAsync(long[] accountIds, CancellationToken token = default)

=> _accountQuery.QueryAsync(_source, accountIds, token);

}

2. 以上调用的例子如下

[Fact]

public async Task Batch()

{

var count = 0;

var service = new AccountBatchService(table, builder);

var list = service.GetAsync([1L, 2L, 3L]);

await foreach (var item in list)

{

_output.WriteLine($"{item.Id}:{item.Amount}");

count++;

}

Assert.Equal(3, count);

}

// 1:100

// 2:200

// 3:300

三、泛型查询

1. 泛型服务类代码

该服务用来按字段Id查询表Account

参数TParam是泛型,这样可以直接使用DTO参数来查询,减少类型转化的开销

返回值TAccount也是泛型,这样就可以直接返回视图模型或者领域模型

这样的泛型服务类就非常的通用

///

/// 账户获取泛型服务

///

///

///

public class AccountGetService(AccountTable table, IShadowBuilder builder)

{

private readonly SqlSource _source = new(builder.DataSource);

private readonly IParamQuery _accountQuery

= builder.BuildResult(

table.ToQuery()

.And(account => account.Id.Equal())

.ToSelect()

.SelectSelfColumns()

);

///

/// 获取账户

///

///

///

///

public Task GetAsync(TParam param, CancellationToken token = default)

=> _accountQuery.GetFirstAsync(_source, param, token);

}

2. 中规中矩的调用方式

var service = new AccountGetService(_table, _builder);

var account = await service.GetAsync(new Account { Id = 1L });

Assert.NotNull(account);

3. 支持简单调用方式

var service = new AccountGetService(_table, _builder);

var account = await service.GetAsync(1L);

Assert.NotNull(account);

四、总结

DBShadow.net预编译比较智能

只有1个参数时支持化繁为简,支持直接传值做为参数值

这样可以节约定义只有一个属性的参数类

参数和返回值类型还可以定义为泛型,可以做到更加灵活忧倨掏以

http://www.jsqmd.com/news/636450/

相关文章:

  • 如何用Foldseek解决蛋白质结构分析难题:从新手到专家的完整指南
  • 接入工具代码讲解
  • 2026贵阳车牌识别系统官方联系方式与智慧停车品牌深度横评|无人值守停车解决方案对标指南 - 精选优质企业推荐榜
  • 2026物联网终端产业观察:AI端侧算力、5G RedCap与渠道下沉的规模化落地 - 格行官方招商总部
  • 经典算法:打家劫舍(动态规划 + 回溯求最优解)C++ 超详细解析
  • AIAgent架构中的多目标优化难题(工业级Agent系统92%失败源于此)
  • 如何用c# 做 mcp/ChatGPT app挂
  • 通过 C# 复制 Word 文档、指定段落、指定节庇
  • 抖音广告批量制作神器:用MATLAB+FFmpeg实现自动视频拼接(附完整源码)
  • Ansible模块
  • 2026年贵阳智慧停车车牌识别系统与安防门禁一体化解决方案深度横评 - 精选优质企业推荐榜
  • 保姆级教程:手把手教你为RTA-OS硬件Counter写那4个要命的回调函数(含避坑指南)
  • 【Redis工具类实战】SpringBoot中静态工具类的配置与多场景应用
  • Freertos中队列头尾指针及读写指针工作机制
  • fMRI(4-1)统计分析报告生成器说明
  • D11 15. 三数之和 18. 四数之和
  • 2026贵阳车牌识别系统与无人值守停车场完全指南:5大本土品牌深度横评+官方直达联系方式 - 精选优质企业推荐榜
  • EtherCAT:工业自动化中的实时通信引擎
  • 别再乱用配合了!SolidWorks装配体设计中‘重合’、‘同轴’、‘距离’三大核心关系的深度解析与实战技巧
  • ESPS USB MSC 调试全过程记录范
  • 璀璨星河Starry Night应用场景:儿童绘本AI辅助创作落地案例
  • 深度解析猫抓扩展:从资源嗅探到流媒体下载的全面实战指南
  • 零基础快速上手:CodeFormer AI人脸修复开源工具完全指南
  • 别再数据线了!用FastAPI 分钟搭个局域网文件+剪贴板神器刭
  • 5分钟掌握模糊PID控制器:让机器人控制像人脑一样智能思考
  • C语言_数组_题3
  • 从CTF赛题到实战:利用phar伪协议绕过上传限制的攻防演练
  • CSS如何保证移动端顶部Fixed头部的安全区域
  • 打通智能体孤岛:用 AgentRun 构建生产级 AA 多 Agent 管理协作系统僦
  • 别再迷信仿真!实测STM32的3.3V PWM也能驱动IR2104(附完整代码与波形分析)