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

扩散模型对抗样本经典baselines乌

一、简化查询

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

相关文章:

  • ArduinoCoreMark:嵌入式MCU整数性能基准测试实战指南
  • LangChain入门示例
  • HEX与BIN文件格式详解及嵌入式开发应用
  • 用可逆数据结构实现 Harness 的无损回滚
  • SparkFun Qwiic OLED Arduino图形库深度解析
  • carsim与Simulink联合仿真:差动驱动电动汽车控制策略详解——高低速驱动力矩分配与路...
  • BGE-M3移动端部署:Android/iOS调用BGE-M3嵌入服务SDK封装
  • 电流传感器的“高精度战争”:从比亚迪兆瓦闪充到构网型逆变器,为什么测量环节成了胜负手?
  • 效率提升30%:OpenClaw+Phi-3-mini-128k-instruct日报生成系统
  • 好用的山东蜂窝卤煮锅推荐
  • 【种植技术干货】土壤板结、重茬难高产?生升农业营养土帮你破局增收
  • # 002、智能体基础架构:从LLM到多模态模型的支撑体系
  • Feed流架构:深入解析推、拉与推拉结合模式
  • Quartus II集成开发环境 |FPGA
  • ERTEC 系列 PROFINET 芯片级硬件过滤器分析仓
  • LD2450毫米波雷达Arduino库:协议抽象与嵌入式鲁棒通信
  • OpenClaw学术合作:Qwen2.5-VL-7B辅助科研团队文献筛选
  • Python大屏展示怎么做_Dash与Streamlit框架快速构建Web版数据看板
  • 闸门管理升级,如何实现实时监测与远程启闭?绿道成帮您解答
  • 企业AI营销GEO布局隐性成本全维度拆解 补全决策认知盲区 实现营销投入可控可持续
  • LeetCode 3740. 三个相等元素之间的最小距离 I, 3741. 三个相等元素之间的最小距离 II【按照相同元素分组】中等
  • 如何把PV数据录入从“人肉战场“变成了全自动流水线
  • 直播预告 | 别再从零写标准了!——AI帮你5分钟生成标准草案
  • CANopen 转 Modbus-RTU 网关应用场景?
  • 为什么你的GraalVM镜像启动快却OOM?揭秘元空间泄漏、反射注册冗余与堆外内存失控的3大隐性杀手
  • 安装对中不到位,丝杆升降机越用越费!5大严重后果必看
  • 频域+卷积神经网络:好发又实用的论文黄金组合!轻松冲CVPR
  • 如何通过WeChatMsg构建个人社交数据智能分析系统
  • OpenClaw自动化运维:Qwen3-14b_int4_awq实现服务器日志分析
  • 终极指南:简单三步解锁《原神》60帧限制,享受丝滑流畅体验