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写法,可以通过动态构造虚拟值表的方式实现:
- 先定义一个存储类型选项的简单实体:
public class RecordType { public string Type { get; set; } }
- 在你的DbContext中添加对应DbSet配置,不需要映射真实物理表:
public DbSet<RecordType> RecordTypes { get; set; }
- 编写查询时先构造虚拟值表,再关联原表:
// 构造固定值的虚拟表 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
相关产品推荐
相关产品推荐

