EF Core 8中如何用LINQ实现带列参数的表值函数关联查询
解决EF Core 8中表值函数(TVF)参数传递及CROSS APPLY转换问题
你的问题出在使用join关联表值函数的方式错误,SQL中的CROSS APPLY在EF Core中需要用SelectMany(或查询语法中的嵌套from)来实现,而非普通的join。以下是对应原SQL的正确LINQ写法:
查询语法写法
var nodworkorders = (from wo in wdc.WORKORDERs // 关联entity表并筛选条件 join woe in wdc.entity on wo.ID equals woe.ID where woe.entity == "aguid" // 对每个工单调用表值函数,对应SQL的CROSS APPLY from nod in wdc.NODWorkorder(wo.ID) // 对应原SQL的返回字段,可根据需求调整 select new { newid = wo.ID, nodId = nod.ID }).ToList();
方法链写法
如果你更习惯方法链风格,也可以写成:
var nodworkorders = wdc.WORKORDERs .Join(wdc.entity, wo => wo.ID, woe => woe.ID, (wo, woe) => new { wo, woe }) .Where(filter => filter.woe.entity == "aguid") .SelectMany( // 对每个符合条件的工单调用TVF item => wdc.NODWorkorder(item.wo.ID), // 关联原工单和TVF返回的父工单,构造结果 (item, nod) => new { newid = item.wo.ID, nodId = nod.ID } ) .ToList();
关键说明
from nod in wdc.NODWorkorder(wo.ID)是EF Core中模拟CROSS APPLY的标准写法,会自动为每个WORKORDER行传递ID参数调用表值函数,并关联返回的结果行。- 若你需要返回原工单实体或父工单实体,只需调整
select部分的内容即可(比如select nod获取父工单,或select wo获取原工单)。
内容的提问来源于stack exchange,提问作者reuben42
相关产品推荐
相关产品推荐

