C#使用Tuple方法实现OpreateResultModel功能

OperateResultModel 类

典型的通用操作结果模型,常用于Web 开发、API 设计和前后端交互,主要作用如下:

  1. 统一接口返回格式:为所有操作提供一致的响应结构

  2. 传递操作状态 :通过 success 字段表示操作是否成功

  3. 携带操作消息 :通过 msg 字段传递错误信息或成功提示

  4. 返回操作数据 :通过 rows /data 字段返回查询结果或操作对象

  5. 支持分页查询 :包含分页相关的字段(total, page, pagesize 等)

使用场景

  1. API 响应:作为 RESTful API 的标准返回格式
  2. AJAX 请求:前端通过 AJAX 获取数据时的标准响应格式
  3. 分页查询:在需要分页的列表查询中返回分页信息
  4. 通用操作结果:增删改查CURD等各种操作的统一返回格式

Tuple 类

Tuple(元组)是一种轻量级的数据结构,用于将多个值组合成一个单一对象,主要作用如下**:**

  1. 基础操作结果 Tuple 结构:(bool Success, string Message)

  2. 带数据的操作结果 Tuple 结构:(bool Success, T Data, string Message)

  3. 分页查询结果 Tuple 结构:(bool Success, List<T> Data, int Total, string Message)

  4. 扩展分页 Tuple 结构(含页码参数):(bool Success, List<T> Data, int Total, int Page, int PageSize, string Message)

  5. 命名元组(增强语义可读性):(bool IsSuccess, T ResultData, int TotalCount, string ErrorMessage)

使用场景

1.临时数据结构:不需要在多处重用的简单数据

2.方法返回值:快速返回多个值,无需创建专门的类

3.LINQ 查询:简化投影结果

4.轻量级需求:不需要复杂的行为或属性

Tuple 模型与原 OperateResultModel 的核心对应关系

原模型字段 Tuple 元素 作用
success Success/IsSuccess 标识操作成功与否(布尔值)
msg Message/ErrorMessage 传递操作提示或错误信息
rows/data Data/ResultData 返回查询结果或操作对象(泛型)
total Total/TotalCount 分页总记录数
page/pagesize Page/PageSize 分页参数(当前页、页大小)

示例:替换 OperateResultModel

假设原有代码:

csharp

复制代码
public class OperateResultModel {
    public bool success { get; set; }
    public object data { get; set; }
    public string msg { get; set; }
}

public OperateResultModel CreateSignFlow(...) {
    // 业务逻辑...
   OperateResultModel orm = new OperateResultModel();
  
        orm.success = true,
        orm.data = new SysSignJumpModel(),
        orm.msg = "创建成功"
    };
}

使用 Tuple 后:

csharp

复制代码
public Tuple(bool Success, SysSignJumpModel Data, string Message) CreateSignFlow(...) {
    // 业务逻辑...

    return new Tuple(true, new SysSignJumpModel(), "创建成功");
}

调用时:

csharp

复制代码
Tuple<bool, model, string> ret = headBll.CreateSignFlow(headmodel);
if (success) {
    // 使用 model...
      orm.success = ret.Item1;
      orm.rows = ret.Item2;
      orm.msg = ret.Item3;
}
        else
        {
            orm.msg = "[]";//空字符串,null
            orm.success = false;
        }
    }
    catch (Exception ex)
    {
        orm.msg = ex.Message;
        orm.success = false;
    }
    return JsonResultHelper.Convert(orm);
}

SQLSugar 中 ExecuteCommand () 的三种返回值处理方式

在 SQLSugar ORM 框架中,.ExecuteCommand() 方法用于执行 SQL 命令并返回受影响的行数。这三种处理方式的区别在于对返回值的判断逻辑:

  1. ExecuteCommand()
  • 返回值类型int(受影响的行数)
  • 用途:获取实际影响的记录数,不做条件判断
  • 适用场景
    • 需要知道具体删除 / 更新了多少条记录
    • 后续逻辑依赖于具体的行数(如批量操作统计)

csharp

复制代码
// 示例:获取实际删除的记录数
int deletedCount = db.Deleteable<TbUserRoleBodyModel>()
    .Where(t => t.ORDERNO == "ORD2023001")
    .ExecuteCommand();
    
// 后续使用 deletedCount 进行统计或日志记录
  1. ExecuteCommand() == 1
  • 返回值类型bool(是否恰好删除 / 更新 1 条)
  • 用途 :确保操作只影响了单条记录
  • 适用场景
    • 删除 / 更新唯一记录(如主键查询)
    • 业务规则要求必须且只能修改一条记录

csharp

复制代码
// 示例:删除特定订单(必须存在且只能存在一条)
bool success = db.Deleteable<TbUserRoleHeadModel>()
    .Where(t => t.ORDERNO == "ORD2023001")
    .ExecuteCommand() == 1;
    
// 如果没有记录或删除多条,都会返回 false
  1. ExecuteCommand() > 0
  • 返回值类型bool(是否删除 / 更新至少 1 条)
  • 用途 :确保操作至少影响了一条记录
  • 适用场景
    • 批量删除 / 更新(不确定具体数量)
    • 业务规则允许删除多条记录(如删除订单下的所有明细)

csharp

复制代码
// 示例:删除订单下的所有明细(可能有0~N条)
bool success = db.Deleteable<TbUserRoleBodyModel>()
    .Where(t => t.ORDERNO == "ORD2023001")
    .ExecuteCommand() > 0;
    
// 删除0条返回 false,删除1~N条返回 true

实际应用对比

场景 1:删除用户唯一配置

csharp

复制代码
// 必须恰好删除1条(用户配置必须存在且唯一)
bool success = db.Deleteable<ParamsTbModel>()
    .Where(p => p.USER_ID == userId && p.KEY == "NOTIFICATION_SETTING")
    .ExecuteCommand() == 1;

场景 2:删除订单下的所有明细

csharp

复制代码
// 可能删除0~N条(订单可能没有明细)
bool success = db.Deleteable<TbOrderDetail>()
    .Where(d => d.ORDER_ID == orderId)
    .ExecuteCommand() > 0;

注意事项

  1. 性能差异

    • 直接使用 ExecuteCommand() 性能最优(无需额外判断)
    • == 1> 0 会增加一次比较操作
  2. 业务逻辑风险

    • 使用 == 1 时,如果记录不存在或存在多条,会返回 false
    • 使用 > 0 时,如果记录不存在,会返回 false
  3. 并发问题

    • 在高并发场景下,建议使用事务或乐观锁
    • 避免在删除前查询记录数(可能导致脏读)
相关推荐
love530love10 分钟前
是否需要预先安装 CUDA Toolkit?——按使用场景分级推荐及进阶说明
linux·运维·前端·人工智能·windows·后端·nlp
BAGAE17 分钟前
Flutter 与原生技术(Objective-C/Swift,java)的关系
java·开发语言·macos·objective-c·cocoa·智慧城市·hbase
咖啡の猫25 分钟前
JavaScript基础-DOM事件流
开发语言·javascript·microsoft
m0_6948455729 分钟前
日本云服务器租用多少钱合适
linux·运维·服务器·安全·云计算
红石程序员35 分钟前
VSCode配置C++项目全攻略
开发语言·c++·visual studio
徐新帅35 分钟前
基于 C 语言的图书管理系统开发详解
c语言·开发语言·数据结构
一心09243 分钟前
Linux部署bmc TrueSight 监控agent步骤
linux·运维·服务器·监控·bmc truesight
Florence2343 分钟前
linux中执行脚本命令的source和“.”和“./”的区别
linux·运维·服务器
Chase_______1 小时前
静态变量详解(static variable)
java·开发语言·jvm
救救孩子把1 小时前
如何在n8n中突破Python库限制,实现持久化虚拟环境自由调用
开发语言·python·n8n