You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL查询返回的Status字符串如何转bool适配OwnershipRole类

解决方案

修改C#映射逻辑(最直接)

你只需要调整GetOwnershipRoles方法中IsWithdrawn字段的赋值逻辑,先读取Status的字符串值再做判断即可,修改后的代码如下:

public List<OwnershipRole> GetOwnershipRoles()
{
    var sql = @"
SELECT ItemID, Title, Status
FROM ItemDetail";

    var data = GetTable(sql);

    return data.Select().Select(dr => new OwnershipRole
    {
        Id = dr.Field<Guid>(0),
        Title = dr.Field<string>(1),
        // 替换原来的bool转换逻辑,新增字符串判断
        IsWithdrawn = !string.Equals(dr.Field<string>(2), "Withdrawn", StringComparison.OrdinalIgnoreCase)
    }).ToList();
}

逻辑说明:

  • 用dr.Field<string>(2)读取Status列的字符串值,不再直接强转为bool类型
  • string.Equals方法加StringComparison.OrdinalIgnoreCase参数可以忽略大小写匹配,避免数据库返回withdrawn、WITHDRAWN这类大小写变体时判断出错
  • 你要求Status等于"Withdrawn"时IsWithdrawn为false,这里用!对匹配结果取反刚好符合要求:匹配成功返回true,取反后为false;匹配失败返回false,取反后为true。

如果需要处理Status为空的场景,可以加空值判断设置默认值,比如空值时默认IsWithdrawn为false,写法如下:

IsWithdrawn = !(dr.Field<string>(2)?.Equals("Withdrawn", StringComparison.OrdinalIgnoreCase) ?? false)

可选方案:SQL层面直接转换

也可以直接在查询SQL中把Status转成布尔值,不需要修改C#的映射逻辑,SQL改写如下:

SELECT 
    ItemID, 
    Title,
    CASE WHEN Status = 'Withdrawn' THEN 0 ELSE 1 END AS Status
FROM ItemDetail

此时查询返回的第三列是数值型(对应C#的bool类型),原来的IsWithdrawn = !dr.Field<bool>(2)逻辑可以正常使用。

内容的提问来源于stack exchange,提问作者lross15

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 20:24:04