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

EF Core 6 如何映射带用户定义表类型参数的可查询表值函数

EF Core 6 表值函数使用用户定义表类型参数的可行性说明

Microsoft.EntityFrameworkCore.SqlServer 6 版本原生不支持直接给已映射的表值函数配置、传入用户定义表类型(UDTT)参数,该特性是EF Core 8.0正式上线的官方原生能力,EF Core 6没有开放对应的公开配置API完成映射,不过可以通过变通方案实现需求。

EF Core 6 可行实现方案

  • 方案1:通过原生ADO.NET参数配合FromSqlRaw调用
    你不需要改动已有的表值函数结果映射,只需要在调用时手动构造结构化SQL参数即可:
    1. 按照数据库中定义的用户定义表类型结构,构造对应结构的DataTable并填充数据,也可以使用IEnumerable<SqlDataRecord>作为传值载体,性能比DataTable更好
    2. 创建SqlParameter实例,将参数类型设置为SqlDbType.Structured,TypeName属性配置为数据库中用户定义表类型的完整名称(比如dbo.YourCustomTableType)
    3. 把构造好的参数传入FromSqlRaw方法调用表值函数即可
      参考代码:
    // 构造和UDTT结构匹配的DataTable
    var paramTable = new DataTable();
    paramTable.Columns.Add("Id", typeof(int));
    paramTable.Columns.Add("Name", typeof(string));
    // 填充业务数据
    paramTable.Rows.Add(1, "test1");
    paramTable.Rows.Add(2, "test2");
    
    // 构造表类型参数
    var tvpParam = new SqlParameter("@customTable", SqlDbType.Structured)
    {
        TypeName = "dbo.IdNameTableType",
        Value = paramTable
    };
    
    // 调用已映射的表值函数
    var queryResult = _yourDbContext.Set<YourTvfResultModel>()
        .FromSqlRaw("SELECT * FROM dbo.YourTableValuedFunction(@customTable)", tvpParam)
        .Where(x => x.IsValid) // 仍然可以在后面拼接EF Core的查询逻辑,会被正常翻译
        .ToList();
    
    注意:传入的表数据结构必须和数据库端定义的UDTT字段顺序、类型完全一致,否则会抛出SQL执行异常。
  • 方案2:使用社区维护的EF Core 6 UDTT映射扩展
    有第三方社区扩展包补全了EF Core 6版本的表类型参数映射能力,不需要升级EF Core版本就能按照类似官方的配置方式完成映射,不过这类包不属于官方维护范畴,接入前需要评估和项目现有依赖的兼容性、以及长期维护风险。

补充说明

如果你的项目允许升级EF Core版本,升级到8.0及以上版本后可以直接使用官方提供的原生API完成用户定义表类型参数的配置,不需要编写变通代码,官方实现的稳定性和查询翻译兼容性更好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 00:54:32