EF Core - query could not be translated, nie potrafię poprawnie ułożyć zapytania.

0

Witam. W serwisie potrzebuję pobrać wszystkie rezerwacje określonych pokojów, których zakres rezerwacji zahacza o podany przedział. Czy możecie mi podpowiedzieć, gdzie może leżeć byk?

private async Task<Room[]> FindFreePlaceInBuildings(Building building, eGender gender, int count, DateTime accommodationTime, DateTime checkoutTime)
            // Pobranie wszystkich pokojów z danego budynku
            var rooms = await _dbContext.Rooms
                .Where(x => x.IsActive)
                .Where(x => x.BuildingId == building.Id)
                .ToArrayAsync();
            var roomsIds = rooms.Select(room => room.Id).ToArray();
            // Pobranie wszystkich zajętych miejsc w pokojach w danym budynku i w danym okresie czasu
            var accommodations = await _dbContext.AccommodatedPersons
                .Include(x => x.Room)
                .Where(x => x.Room != null)
                .Where(x => roomsIds.Contains(x.RoomId.Value))
                .Where(x => (x.AccommodatedFrom < accommodationTime && x.AccommodatedTo > accommodationTime) ||
                            (x.AccommodatedFrom < checkoutTime && x.AccommodatedTo > checkoutTime) ||
                            (x.AccommodatedFrom > accommodationTime && x.AccommodatedTo < checkoutTime) ||
                            (x.AccommodatedFrom < accommodationTime && x.AccommodatedTo > checkoutTime))
                .GroupBy(x => x.Room)
                .ToArrayAsync();

Otrzymuję wyjątek:

System.InvalidOperationException: The LINQ expression 'DbSet<AccommodatedPerson>
    .LeftJoin(
        outer: DbSet<Room>, 
        inner: a => EF.Property<Nullable<Guid>>(a, "RoomId"), 
        outerKeySelector: r => EF.Property<Nullable<Guid>>(r, "Id"), 
        innerKeySelector: (o, i) => new TransparentIdentifier<AccommodatedPerson, Room>(
            Outer = o, 
            Inner = i
        ))
    .Where(a => EF.Property<Nullable<Guid>>(a.Inner, "Id") != null)
    .Where(a => __roomsIds_0
        .Contains(a.Outer.Id))
    .Where(a => a.Outer.AccommodatedFrom < __accommodationTime_1 && a.Outer.AccommodatedTo > __accommodationTime_1 || a.Outer.AccommodatedFrom < __checkoutTime_2 && a.Outer.AccommodatedTo > __checkoutTime_2 || a.Outer.AccommodatedFrom > __accommodationTime_1 && a.Outer.AccommodatedTo < __checkoutTime_2 || a.Outer.AccommodatedFrom < __accommodationTime_1 && a.Outer.AccommodatedTo > __checkoutTime_2)
    .GroupBy(
        source: a => a.Inner, 
        keySelector: a => a.Outer)' could not be translated.
1

Tak na szybko obstawiam to: .

Where(x => x.Room != null)

Zresztą po co Ci to jak masz:

.Where(x => roomsIds.Contains(x.RoomId.Value))

btw:

Po co pobierać wszystkie dane jak potrzebujesz tylko idki?

 var rooms = await _dbContext.Rooms
                .Where(x => x.IsActive)
                .Where(x => x.BuildingId == building.Id)
                .ToArrayAsync();
            var roomsIds = rooms.Select(room => room.Id).ToArray();

zrób może tak:

 var roomsIds  = await _dbContext.Rooms
                .Where(x => x.IsActive)
                .Where(x => x.BuildingId == building.Id)
                .Select(x=> x.Id)
                .ToArrayAsync();

1 użytkowników online, w tym zalogowanych: 0, gości: 1