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参数即可:- 按照数据库中定义的用户定义表类型结构,构造对应结构的
DataTable并填充数据,也可以使用IEnumerable<SqlDataRecord>作为传值载体,性能比DataTable更好 - 创建
SqlParameter实例,将参数类型设置为SqlDbType.Structured,TypeName属性配置为数据库中用户定义表类型的完整名称(比如dbo.YourCustomTableType) - 把构造好的参数传入
FromSqlRaw方法调用表值函数即可
参考代码:
注意:传入的表数据结构必须和数据库端定义的UDTT字段顺序、类型完全一致,否则会抛出SQL执行异常。// 构造和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(); - 按照数据库中定义的用户定义表类型结构,构造对应结构的
- 方案2:使用社区维护的EF Core 6 UDTT映射扩展
有第三方社区扩展包补全了EF Core 6版本的表类型参数映射能力,不需要升级EF Core版本就能按照类似官方的配置方式完成映射,不过这类包不属于官方维护范畴,接入前需要评估和项目现有依赖的兼容性、以及长期维护风险。
补充说明
如果你的项目允许升级EF Core版本,升级到8.0及以上版本后可以直接使用官方提供的原生API完成用户定义表类型参数的配置,不需要编写变通代码,官方实现的稳定性和查询翻译兼容性更好。
内容的提问来源于stack exchange,提问作者JoePR
相关产品推荐
相关产品推荐

