我使用EF6和Code First,并且有几个表具有几乎相同的模式。我希望能够对这些表执行查询并将结果返回到公共对象(类),而不是为每个表创建一个新对象。
因此,例如,EF不允许:
public class Product1 {
public int id { get; set; }
public string name { get; set; }
}
public DbSet<Product1> Products1 { get; set; }
public DbSet<Product1> Products2 { get; set; }
所以我必须定义第二个POCO:
public class Product1 {
public int id { get; set; }
public string name { get; set; }
}
public class Product2 {
public int id { get; set; }
public string name { get; set; }
}
public DbSet<Product1> Products1 { get; set; }
public DbSet<Product2> Products2 { get; set; }
至少我希望能够将这些POCO的结果处理得相同,以便我可以将结果插入另一个类:
public class SomeClass {
public <Product1 or Product2> Product { get; set; }
}
能够将db表中的结果存储在同一个对象中:
SomeClass someclass = new SomeClass();
someclass.Product = _context.Products1.Where(p => p.id == 1).First();
或
someclass.Product = _context.Products2.Where(p => p.id == 1).First();
int thisId = someclass.Product.id;
如何使someclass.Product
通用,以便它接受Product1或Product2?
答案 0 :(得分:1)
您必须使类从接口继承,然后在泛型类型约束中使用该接口。
public interface IProduct
{
int id { get; set; }
string name { get; set; }
}
public class Product1 : IProduct
{
public int id { get; set; }
public string name { get; set; }
}
public class Product2 : IProduct
{
public int id { get; set; }
public string name { get; set; }
}
然后你可以按如下方式定义SomeClass:
public class SomeClass<TProduct> where TProduct : IProduct
{
public TProduct Product { get; set; }
}