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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 23:05:24