如何 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
。或者它会尝试创建一个新列。
所以这是我的实体:
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
。或者它会尝试创建一个新列。