EF Core First Eager加载继承筛选器



我定义了以下实体:

public class Computer
{
[Key]
public int Id { get; set; }
[Required]
[StringLength(15)]
public string Name { get; set; } = null!;
[Required]
public List<ComputerAction> Actions { get; set; } = new();
}
public abstract class ComputerAction
{
[Key]
public int Id { get; set; }
public List<HistoryEntry> History { get; set; } = new();
public Computer Computer { get; set; } = null!;
[NotMapped]
public Status Status => History.LastOrDefault()?.Status ?? Status.Unknown;
public abstract Task<HistoryEntry> ExecuteAsync();
}
public class RenewCertificateAction : ComputerAction
{
public override Task<HistoryEntry> ExecuteAsync() 
{
// Whatever
}
}
public class PingAction : ComputerAction
{
private readonly Ping _ping = new();
public override async Task<HistoryEntry> ExecuteAsync()
{
// Whatever
}
}
public class HistoryEntry
{
[Key]
public int Id { get; set; }
[Required]
public Status Status { get; set; }
[Required]
public DateTime WhenExecuted { get; set; }
}

我的DbContext如下:

public class ComputerContext : DbContext
{
public ComputerContext(DbContextOptions<ComputerContext> options)
: base(options)
{
}
public static readonly string ComputerDb = nameof(ComputerDb);
public DbSet<Computer> Computers { get; set; } = null!;
public DbSet<RenewCertificateAction> RenewCertificateActions { get; set; } = null!;
public DbSet<PingAction> PingActions { get; set; } = null!;
public DbSet<HistoryEntry> History { get; set; } = null!;
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Computer>().HasMany(x => x.Actions).WithOne(x => x.Computer).OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity<ComputerAction>().ToTable("ComputerActions").HasMany(x => x.History).WithOne().OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity<HistoryEntry>().ToTable("ComputerActionEntries");
}
}

我想获得所有计算机的列表,但如果它们碰巧有PingAction类型的操作,那么也加载该操作(仅加载该操作,而不是所有操作(。

对我来说合乎逻辑的是类似dbContext.Computers.Include(x => x.Actions.OfType<PingAction>())的东西,但它显然无法转换为查询。如何只做特定类型的ActionsInclude

您可以在其中使用include:

dbContext.Computers.Include(x => x.Actions.Where(action => action is PingAction))

更多解释:https://stackoverflow.com/a/61147681/11143288

最新更新