.NET Core 6 MVC Code First:如何将3个表数据合并为一个列表?
解决方案
方法一:EF Core LINQ合并(数据库层面执行)
这种方式让EF Core生成UNION ALL(或UNION)SQL语句,在数据库层面完成合并,性能更优。
1. 配置实体与表映射
假设三个表名为TableA、TableB、TableC,结构和Shirt完全一致,可通过继承基类复用属性,并指定表名:
// 基类统一定义共享属性 public class ShirtBase { public int Id { get; set; } public string Name { get; set; } public int Quantity { get; set; } public int IdCategory { get; set; } } [Table("TableA")] public class TableA : ShirtBase { } [Table("TableB")] public class TableB : ShirtBase { } [Table("TableC")] public class TableC : ShirtBase { }
2. 在DbContext中注册DbSet
public class YourDbContext : DbContext { public DbSet<TableA> TableA { get; set; } public DbSet<TableB> TableB { get; set; } public DbSet<TableC> TableC { get; set; } public DbSet<Shirt> Shirt { get; set; } // 保留原有Shirt表的DbSet(若需) // 其他DbContext配置... }
3. 实现合并查询方法
将三个表的数据转换为Shirt类型后合并,返回与示例一致的结果:
public async Task<IEnumerable<Shirt>> LoadAllShirt() { var query = _dbContext.TableA .Select(a => new Shirt { Id = a.Id, Name = a.Name, Quantity = a.Quantity, IdCategory = a.IdCategory }) .Concat(_dbContext.TableB.Select(b => new Shirt { Id = b.Id, Name = b.Name, Quantity = b.Quantity, IdCategory = b.IdCategory })) .Concat(_dbContext.TableC.Select(c => new Shirt { Id = c.Id, Name = c.Name, Quantity = c.Quantity, IdCategory = c.IdCategory })); return await query.ToListAsync(); }
- 无需去重用
Concat(对应SQLUNION ALL);需要去重则替换为Union(对应SQLUNION)。
方法二:直接执行原生SQL
若不想创建多个实体类,可直接写原生SQL并映射到Shirt实体:
public async Task<IEnumerable<Shirt>> LoadAllShirt() { var sql = @" SELECT Id, Name, Quantity, IdCategory FROM TableA UNION ALL SELECT Id, Name, Quantity, IdCategory FROM TableB UNION ALL SELECT Id, Name, Quantity, IdCategory FROM TableC"; return await _dbContext.Shirt.FromSqlRaw(sql).ToListAsync(); }
注意事项
- 确保三个表的列名、数据类型与
Shirt实体完全匹配,避免映射错误。 - 若表间
Id存在重复,Concat会保留所有重复项,Union会基于全列匹配自动去重。
内容的提问来源于stack exchange,提问作者Nguen
相关产品推荐
相关产品推荐

