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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 09:11:08