如何 select 所有列包括所有继承列?

How to select all columns including all inheritance columns?

所以这是我的实体:

public class Stock {
    public Guid ID { get; set; }
    public decimal Qty { get; set; }
    .....
}

我对这个有很多继承Stock:

public class StockA : Stock {
    public string Spec { get; set; }
    ....
}

public class StockB : Stock {
    public string Color { get; set; }
    ....
}

public class StockC : Stock {
    public string Variant { get; set; }
    ....
}

public class StockD : Stock {
    public string Type { get; set; }
    ....
}

.....

假设有超过10个遗产。如何从 Stock 及其继承中获取所有列?

例如,我需要这些列:

ID
Qty
Spec
Color
Variant
Type
....

我试图定义一个组合实体:

public class AllStock {
    public Guid ID { get; set; }
    public decimal Qty { get; set; }
    public string Spec { get; set; }
    public string Color { get; set; }
    public string Variant { get; set; } 
    public string Type { get; set; }
    .....
}

我在 DBContext 中设置了它:

public DbSet<AllStock> AllStocks { get; set; }

但是当我查询的时候:

var x = await db.AllStocks.ToList();

它returns 空列表。我想这个 AllStock 实体与另一个实体是分开的。

我该怎么做?

尝试以下方法Select

var result = await db.Stocks
    .Select(x => new 
    {
        x.ID,
        x.Qty,

        Spec    = x is StockA ? ((StockA)x).Spec    : null,
        Color   = x is StockB ? ((StockB)x).Color   : null,
        Variant = x is StockC ? ((StockC)x).Variant : null,
        Type    = x is StockD ? ((StockD)x).Type    : null
    })
    .ToListAsync();

我可以用 FromSqlRaw 做到这一点。

首先赋值给DbSet:

public DbSet<StockVM> AllStocks { get; set; }

然后用 HasNoKey:

设置模型构建器
mb.Entity<StockVM>().HasNoKey();

那么这是查询:

return db.AllStocks.FromSqlRaw(@"
    SELECT" +
    GetSelect() +
    @" FROM Stocks
        INNER JOIN Colors ON Stocks.ColorId = Colors.ID
        INNER JOIN Units ON Stocks.UnitId = Units.ID
        INNER JOIN Items ON Stocks.ItemId = Items.ID
        INNER JOIN ItemTypes ON Stocks.ItemTypeId = ItemTypes.ID
    ");

我还必须创建一个具有所有属性的实体:

public class StockVM{
    public Guid ID { get; set; }
    public decimal Qty { get; set; }
    public string Spec { get; set; }
    public string Color { get; set; }
    public string Variant { get; set; } 
    public string Type { get; set; }
    .....
}

重要

迁移时要小心,确保从 Up() 中删除 AllStock。或者它会尝试创建一个新列。