0

Hello I'm using EF 7 with cosmos db. I have one containers in cosmosdb with entities similar to below 2 classes.

public class Ride: AuditEntity
{
    [Key]
    public Guid RideId { get; set; }

    public Guid VehicleId { get; set; }

    public Vehicle Vehicle { get; set; }

}


public class Vehicle : AuditEntity
{
    public Guid VehicleId { get; set; }

    public string Model { get; set; }
}

I have defined the relationship and keys as below: -

modelBuilder.Entity<Vehicle>().ToContainer("Rides").HasPartitionKey(o => o.PartitionKey).HasKey(o => o.VehicleId);
modelBuilder.Entity<Ride>().ToContainer("Rides").HasPartitionKey(o => o.PartitionKey);

modelBuilder.Entity<Ride>().HasOne(o => o.Vehicle).WithMany().HasForeignKey(o => o.VehicleId).HasPrincipalKey(v => v.VehicleId);

Now when I try to retrieve a ride by ID along with the vehicle using below LINQ query:-

ride = db.Rides.Where(_ => _.PartitionKey == key)
                    .Where(_ => _.IsDeleted == false && _.RideId == id)
                    .Include(m => m.Vehicle) 
                    .FirstOrDefault();

I get below error

The LINQ expression 'DbSet<Ride>()
    .Where(r => r.PartitionKey == __loginUser_0)
    .Where(r => r.IsDeleted == False && r.RideId == __id_1)
    .Join(
        inner: DbSet<Vehicle>(), 
        outerKeySelector: r => EF.Property<Guid?>(r, "VehicleId"), 
        innerKeySelector: v => EF.Property<Guid?>(v, "VehicleId"), 
        resultSelector: (o, i) => new TransparentIdentifier<Ride, Vehicle>(
            Outer = o, 
            Inner = i
        ))' could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly

by inserting a call to 'AsEnumerable', 'AsAsyncEnumerable', 'ToList', or 'ToListAsync'. See https://go.microsoft.com/fwlink/?linkid=2101038 for more information.

ONly solution I can find is to use client-side evaluation by explicitly converting the query to a list using the ToList() or AsEnumerable() method and then do explicit join like this

dbContext.Rides
    .Where(r => r.PartitionKey == __loginUser_0 && r.IsDeleted == false && r.RideId == __id_1)
    .ToList()
    .Join(
        inner: dbContext.Vehicles,
        outerKeySelector: r => r.VehicleId,
        innerKeySelector: v => v.VehicleId,
        resultSelector: (o, i) => new TransparentIdentifier<Ride, Vehicle>(
            Outer = o,
            Inner = i
        ))
    .FirstOrDefault();

But I don't want to resort to client-side evaluation as this is a fairly simple and common usecase.Can anyone please help me with this? Any help is appreciated. Thanks

0 Answers0