ExecuteQuery 对 bit/bool 类型的处理
SQL Server 中 bit 类型存储为 0/1,但 ExecuteQuery<T> 映射到 C# bool 时可能出现转换问题。解决办法是借助一个中间属性间接判断。
class Program
{
static void Main(string[] args)
{
using (var dbContext = new DataClasses1DataContext())
{
var total = dbContext.ExecuteQuery<int>("select count(1) from [user]").FirstOrDefault();//4
var list = dbContext.ExecuteQuery<UserEx>("select * ,1 as Enable from [user]").ToList();
}
}
}
class UserEx
{
public long ID { set; get; }
public string Name { set; get; }
public string Password { set; get; }
public int? Status { set; get; }
public DateTime AddTime { set; get; }
public int Enable { set; get; }
public bool IsEnable { get { return Enable == 1; } set { } }//借助额外属性判断
}Code language: JavaScript (javascript)
说明:
| 问题 | 原因 | 解决方式 |
|---|---|---|
ExecuteQuery<User> 映射 bool 失败 | SQL Server bit 返回 True/False,ExecuteQuery 无法直接转 C# bool | 用 int 接收,再加一个 bool 计算属性 |
SQL 中 select * ,1 as Enable | 新增一列 Enable 映射为 int | 实体类中 Enable 接收该列值 |
IsEnable 属性 | 只读计算属性,get 中判断 Enable == 1 | 对外暴露 bool,内部用 int 中转 |
SQL Server bit 与 C# bool 对应关系:
| SQL Server bit | C# |
|---|---|
| 1 / True | true |
| 0 / False | false |
| NULL | null(需 bool?) |
关键要点:
| 要点 | 说明 |
|---|---|
ExecuteQuery 映射 | 列名匹配属性名,类型需兼容 |
| bit → bool 失败 | 用 int 中间字段接收 |
| 计算属性 | bool 属性 get 中判断 int 值 |
| SQL 中加列 | select *, 1 as Enable 为每行加固定值列 |
| 替代方案 | 用 ExecuteQuery 查 bit 列时改为 cast(col as int) |
Previous: ExecuteQuery 执行查询并返回实体列表