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

EFCore关联内存表拆分ins/outs属性实现条目复制的方案咨询

解决方案

方案1:Concat拼接查询(兼容性最优,无需额外配置)

直接将两种类型的查询结果拼接,EF Core可直接翻译为服务端执行的SQL,后续可正常追加关联、过滤等操作:

var splitQuery = data
    .Select(d => new { type = "ins", value = d.ins /* 可追加需要保留的原表其他字段 */ })
    .Concat(data
        .Select(d => new { type = "outs", value = d.outs /* 和上面的匿名类结构保持完全一致 */ }));

该方案生成的SQL执行效率和你手写的原生JOIN VALUES写法一致,不需要修改数据库结构或者额外配置DbContext。

方案2:FromSqlRaw构造虚拟值表(完全匹配原生SQL逻辑)

如果需要完全对齐你写的JOIN VALUES写法,可以通过动态构造虚拟值表的方式实现:

  1. 先定义一个存储类型选项的简单实体:
public class RecordType
{
    public string Type { get; set; }
}
  1. 在你的DbContext中添加对应DbSet配置,不需要映射真实物理表:
public DbSet<RecordType> RecordTypes { get; set; }
  1. 编写查询时先构造虚拟值表,再关联原表:
// 构造固定值的虚拟表
var typeTable = dbContext.RecordTypes.FromSqlRaw("SELECT 'ins' AS Type UNION ALL SELECT 'outs' AS Type");

// 关联查询实现拆分
var splitQuery = from d in data
                 from t in typeTable
                 select new 
                 {
                     type = t.Type,
                     value = t.Type == "ins" ? d.ins : d.outs
                     /* 可追加其他需要的字段 */
                 };

方案3:物理辅助表(适合高频使用场景)

如果这个拆分逻辑在项目中多处使用,可直接在数据库中创建一个只有type字段的固定辅助表,存入ins和outs两条固定记录,映射到EF Core实体后直接关联即可,性能和可维护性更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 18:45:03