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