How can I provide subquery for expanding navigation properties

25 Views Asked by At

I created a database as follows

CREATE TABLE customers 
(
    id UUID PRIMARY KEY
);

CREATE TABLE customer_addresses 
(
    customer_id UUID REFERENCES customers (id) NOT NULL,
    valid_since TIMESTAMPTZ DEFAULT NOW NOT NULL,
    address TEXT NOT NULL,
    PRIMARY KEY (customer_id, valid_since)
);

customers holds some customer related data (omitted for brevity) and customer_addresses contains data a list of all addresses registered to the users. The active address is the address with the most recent valid_since entry.

I want to use EF Core, so I created entity classes with corresponding configurations as follows:

public class DbCustomer
{
    public required Guid Id { get; set; }
    public DbAddress Address { get; set; } = null!;
}

internal class CustomersConfiguration : IEntityTypeConfiguration<DbCustomer>
{
    public void Configure(EntityTypeBuilder<DbCustomer> builder)
    {
        builder.ToTable("customers");
        builder.HasKey(x => x.Id);
        
        builder.Property(x => x.Id).HasColumnName("id");
        
        builder
            .HasOne(x => x.Address)
            .WithMany()
            .HasForeignKey(x => { x.Id, /* Here I want the latest ValidSince of all DbAddresses */ })
            .IsRequired();
    }
}

and

public class DbAddress
{
    public required Guid CustomerId { get; set; }
    public required DateTimeOffset ValidSince { get; set; }
    public required string Address { get; set; }
}

internal class CustomersConfiguration : IEntityTypeConfiguration<DbAddress>
{
    public void Configure(EntityTypeBuilder<DbAddress> builder)
    {
        builder.ToTable("customer_addresses");
        builder.HasKey(x => new { x.Id, x.ValidSince });
        
        builder.Property(x => x.CustomerId).HasColumnName("customer_id");
        builder.Property(x => x.ValidSince).HasColumnName("valid_since");
        builder.Property(x => x.Address).HasColumnName("address");
    }
}

I want the navigation property on DbCustomer to expand according to the the following logic

SELECT * 
FROM identities ident
INNER JOIN customer_addresses addr ON (ident.id = addr.customer_id) 
                                   AND (addr.valid_since = (SELECT tmp.valid_since 
                                                            FROM customer_addresses tmp 
                                                            WHERE ident.id = tmp.customer_id
                                                            ORDER BY tmp.valid_since DESC 
                                                            LIMIT 1)

How can I express that in EF Core?

0

There are 0 best solutions below