使用继承时如何列出所有项目?

帕格

我正在尝试使用继承。我有三个模型

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用分页列出表格中的所有项目

使用 python-gitlab 列出所有项目时列出索引超出范围

如何自动列出所有在Java中使用第三方组件+阵营项目?

如何使用rest api调用列出azure devops项目中的所有错误?

如何选择recyclerview中列出的所有项目?

如何在Powershell中列出目录中的所有项目

如何快速列出组织中的所有 Google Cloud 项目?

MySQL:如何列出所有项目并进行排序?

如何列出项目的所有上传内容?

如何列出项目中所有表格的大小

如何列出 GCP 中属于特定组织的所有项目

如何列出与某个类别相关的所有项目

Java列出每个文件使用的所有项目导入

使用单一链接算法时,如何列出所有当前群集?

如何在列出所有正在运行的进程时使用procps-3.2.8?

查询Consul群集DNS时如何列出所有IP?

使用POST时变量不会继承到所有库

如何列出所有承诺

如何使用 nftables 列出所有端口和服务?

如何使用SQL列出所有postgres规则?

如何列出Linux引导期间使用的所有文件

如何列出npm将使用的所有注册表?

如何列出通话中使用的所有符号?

使用iOS Photos Framework,如何列出所有可用的PHAssetCollections?

如何使用Drive SDK列出域中的所有Google文档?

如何使用Haskell列出图形中的所有路径

如何使用python动态列出目录中的所有文件?

如何使用pyqgis列出Geopackage上的所有图层?

如何使用boto / python列出所有可用的AWS实例