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

Agent-Sandbox UI 上线,来看看有哪些的功能是你经常使用的?嘏

一、简化查询

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/632716/

相关文章:

  • 存储文件操作
  • intv_ai_mk11镜像免配置:开箱即用网页界面+独立venv环境部署解析
  • Lychee-Rerank快速部署:Windows/Mac/Linux三平台Streamlit启动指南
  • 不满意Oh My Zsh启动卡顿,来试试Starship吧燎
  • 2026年知名的化工厂酸原料/工业盐酸原料/氢氧化钠酸原料厂家推荐与选择指南 - 行业平台推荐
  • lora-scripts详细使用手册:图文并茂,带你完成LoRA训练全流程
  • 2026年评价高的北京办公室装修设计/北京办公室装修工程高评分公司推荐 - 行业平台推荐
  • 别再踩坑了!SQL Server数据类型那点事儿,看懂这篇少背三个锅型
  • 前端代码质量检查
  • Qwen3-Reranker实战案例:构建带反馈机制的迭代式RAG重排系统
  • 5分钟搞定:DeepSeek-R1-Distill-Qwen-1.5B网页版对话机器人搭建
  • 【实战部署+模型优化】YOLOv8花卉分类检测系统:从数据集构建到Web端应用全流程解析
  • 2026年比较好的卷材珍珠棉/护角珍珠棉/定制珍珠棉厂家最新推荐 - 品牌宣传支持者
  • Qwen Pixel Art新手指南:如何用Gradio界面实时调整prompt并预览变化
  • Pixel Couplet Gen 运维指南:模型服务监控与高可用保障
  • Whisper-large-v3案例展示:真实客服录音转写效果对比
  • 快速上手黑丝空姐-造相Z-Turbo:基于Z-Image-Turbo的Lora模型实战
  • 一键部署语音情感识别AI:Emotion2Vec+ Large镜像开箱即用教程
  • 一键复制TensorFlow-v2.9环境:从官方镜像提取配置,避免安装错误
  • 2026年质量好的漂珠板开料机/数控开料机厂家综合实力参考(2025) - 品牌宣传支持者
  • 政务数据安全实战:让敏感信息在用时脱敏、退场时彻底消失
  • CSS面试题2
  • Ubuntu服务器一键部署Qwen3.5-9B-AWQ-4bit:完整环境配置与性能调优
  • K8s持久化存储深度解析:PV、PVC、StorageClass三剑客的生产实战
  • Obsidian Dataview如何用3个核心策略将Markdown笔记变成智能知识网络?
  • 从《赚钱思维》到《持续成交》:陈卫军构建中国本土营销理论体系
  • 2026年比较好的磨砂玻璃/内置百叶玻璃/玻璃全方位厂家推荐参考 - 行业平台推荐
  • LabVIEW多路PID与循环单路PID区别
  • 网盘直链解析引擎:八大平台真实链接获取与下载效率优化方案
  • Python的__complex__方法支持复数运算扩展与数值类型