1. 链式方法显式转换

通过.Cast<T>方法直接指定目标类型:

var result = _fsql.Select<object>()
    .Where("age > @0", "18")
    .Cast<int>() // 将字符串类型字段显式转为int
    .ToList();

适用场景:动态查询时明确字段类型。


2. SQL函数转换

通过.WithSql或原生SQL调用数据库转换函数:

// SQL Server风格
var users = _fsql.Query("SELECT CONVERT(varchar(10), create_time, 120) AS formatted_time FROM users")
    .ToList<dynamic>();

支持函数包括:

  • CAST(age AS BIGINT)
  • CONVERT(DATETIME, '2023-01-01', 120)(指定日期格式)

3. 实体类映射配置

在实体类中通过[Column(DbType = "目标类型")]指定字段类型:

public class User {
    [Column(DbType = "decimal(18,2)")]
    public double Salary { get; set; } // 自动映射为decimal类型
}

优势:持久化时自动处理类型转换。


4. 动态类型转换

使用ToList<dynamic>ToList<ExpandoObject>进行动态处理:

var data = _fsql.Select<User>()
    .ToList<dynamic>()
    .Select(d => (decimal)d.Age); // 运行时类型转换

注意:需处理转换异常(如InvalidCastException)。


5. 全局类型处理器

通过FreeSqlBuilder.UseConnectionString配置全局类型映射:

var fsql = new FreeSqlBuilder()
    .UseConnectionString(DataType.SqlServer, "...")
    .UseMapping(typeof(DecimalToDoubleTypeHandler)) // 自定义类型处理器
    .Build();

自定义处理器示例:

public class DecimalToDoubleTypeHandler : TypeHandler<decimal, double> {
    public override double Deserialize(object value) => Convert.ToDouble(value);
    public override decimal Serialize(double value) => (decimal)value;
}

适用场景:统一处理特定类型转换。


6. Lambda表达式转换

在查询时使用.Select投影转换字段类型:

var query = _fsql.Select<User>()
    .Select(u => new {
        IntId = (int)u.Id, // 显式类型转换
        Date = DateTime.Parse(u.CreateTimeString)
    });

优势:编译时类型检查,避免运行时错误。


7. JSON序列化控制

结合System.Text.Json配置全局转换规则:

services.AddControllers().AddJsonOptions(options => {
    options.JsonSerializerOptions.Converters.Add(new DecimalToStringConverter());
});

自定义转换器示例:

public class DecimalToStringConverter : JsonConverter<decimal> {
    public override decimal Read(ref Utf8JsonReader reader, ...) => decimal.Parse(reader.GetString());
    public override void Write(...) => writer.WriteStringValue(value.ToString());
}

适用场景:API返回时统一格式化数据。


总结对比

方法 适用阶段 优点 注意事项
链式.Cast<T> 查询时 显式控制类型 需确保数据库支持转换逻辑
SQL函数 数据库层 利用数据库原生性能 语法依赖特定数据库
实体类映射 模型定义 全局生效 需修改实体类
动态类型转换 内存处理 灵活处理未知结构 需异常处理
全局类型处理器 持久化/查询 统一处理复杂转换 需提前配置
Lambda投影转换 查询结果处理 编译时安全 仅限简单类型转换

根据实际场景选择方法,优先推荐链式转换和实体类映射以保证类型安全,动态场景可结合 SQL 函数和 JSON 序列化控制实现灵活处理。