我正在尝试使用继承。我有三个模型
class Animal {string name;}
class Cat : Animal {int meowPerHour}
class Dog : Animal {bool mixedBreed}
Ef core 已经创建了一个鉴别器列,我可以单独列出猫或狗,我可以创建新项目。问题是我想列出所有具有各自独特属性的动物。例如,如果该行是 Cat,则打印 meowPerHour。但是 mewPerHour 不是 Animal 类中的属性或方法。我正在使用下面的代码打印所有动物。
public IList<Animal> Aniamls { get;set; }
public async Task OnGetAsync()
{
Animals = await _context.Animal.ToListAsync();
}
我该如何解决这个问题?
您可以使用以下方法,但要注意这种方法会急切地加载所有动物,并且可能并不适合您的所有情况。
public IEnumerable<IAnimal> GetAllAnimals()
{
List<IAnimal> allAnimals = GetAllEntriesByEntityInterface<IAnimal>();
return allAnimals;
}
将所有实体合并到一个列表中的方法
private List<T> GetAllEntries<T>() where T : class
{
List<IQueryable<T>> sets = typeof(T).IsInterface ? GetAllSetsByInterface<T>() : GetAllSetsByBaseClass<T>();
List<T> allEntries = new List<T>();
foreach (var item in sets)
{
allEntries.AddRange(item.ToList());
}
return allEntries;
}
在这里,我们正在获取实现 T 的泛型类的所有实体集。如果您需要使用接口,此方法可能很有用。
private List<IQueryable<T>> GetAllSetsByInterface<T>() where T : class
{
var types = context.Model.GetEntityTypes().Select(t => t.ClrType).ToList().Where(t => t.GetInterfaces().Any(i => i == typeof(T))).ToList();
var sets = types.Select(type =>
context.GetType()
.GetMethod("Set")
.MakeGenericMethod(type)
.Invoke(context, null)
as IQueryable<T>
).ToList();
return sets;
}
以及获取从 T 的泛型类派生的所有实体集的方法
private List<IQueryable<T>> GetAllSetsByBaseClass<T>() where T : class
{
var types = context.Model.GetEntityTypes().Select(t => t.ClrType).Where(x => x.IsSubclassOf(typeof(T))).ToList();
var sets = types.Select(type =>
context.GetType()
.GetMethod("Set")
.MakeGenericMethod(type)
.Invoke(context, null)
as IQueryable<T>
).ToList();
return sets;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句