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
相关产品推荐
相关产品推荐

