. net core 3.0 с использованием Entity Framework Linq к проблеме запроса сущностей - PullRequest
0 голосов
/ 29 мая 2020

У меня проблема с переводом моего рабочего запроса SQL в запрос метода Linq. Кажется, я не могу понять, как фильтровать родительские записи на основе Max (date) в дочерних записях.

My Table structure

щелкните, чтобы увеличить

Рабочие SQL, которые у меня есть:

SELECT a.BookingId, a.DestinationId, b.BookingTrackingId, b.DateModified, c.BookingStatusDescription
FROM dbo.Bookings AS a 
INNER JOIN dbo.Bookingtrackings AS b ON b.BookingId = a.BookingId 
INNER JOIN dbo.Bookingstatus AS c ON c.BookingStatusId = b.BookingStatusId
WHERE (b.DateModified = (SELECT MAX(DateModified) AS Expr1
                         FROM dbo.Bookingtrackings
                         WHERE (BookingId = b.BookingId))) AND (c.BookingStatusDescription = N'Booking Requested by Hunter') AND (a.DestinationId = N'77780006-ED6E-4204-B7D1-AE5806EBCC1B')

Что, если бы попробовали:

 var bookingsq = (from bookings in _indondoDBContext.Bookings
                         join bookingtrackings in _indondoDBContext.Bookingtrackings on bookings.BookingId equals bookingtrackings.BookingId into JoinedCategory
                         from bookingtrackings in JoinedCategory.DefaultIfEmpty()
                         where bookingtrackings.DateModified == _indondoDBContext.Bookingtrackings.Where(bt => bt.BookingId == bookingtrackings.BookingId).Max(r => r.DateModified)
                         && bookings.DestinationId == destinationid
                         && bookingtrackings.BookingStatusId == Guid.Parse("e24f83b6-868f-4d84-935a-9508eb04c97c")
                         select new Bookings()
                         {
                             BookingId = bookings.BookingId,
                             ArrivalDate = bookings.ArrivalDate,
                             DepartureDate = bookings.DepartureDate,
                             Hunters = bookings.Hunters,
                             NonHunters = bookings.NonHunters,
                             AdditionalInformation = bookings.AdditionalInformation,
                             EstimatedAmount = bookings.EstimatedAmount,
                             BookingTransactionDate = bookings.BookingTransactionDate,


                             //BookingTypeId = bookings.BookingTypeId,
                             //DestinationId = bookings.DestinationId,
                             //ApplicationUserId = bookings.AccommodationId.ToString(),
                             //AccommodationId = bookings.AccommodationId,
                             //OrderId = bookings.OrderId,

                             //BookingTypes = bookings.BookingTypes,
                             ////Orders = bookings.Orders,
                             ////Destinations = bookings.Destinations,
                             //ApplicationUser = bookings.ApplicationUser,
                             //Accommodations = bookings.Accommodations,
                             //Bookingtrackings = bookings.Bookingtrackings,                                
                         })
                         .ToList();

        foreach (Bookings item in bookingsq)
        {
            _indondoDBContext.Bookings.Attach(item);
            _indondoDBContext.Entry(item).Collection(x => x.Bookingtrackings).Load();
        }

Это не возвращает все навигационные реквизиты, которые мне нужны (тоже очень долго, я бы предпочел синтаксис Linq Method), также я не знаю, как прикрепить больше детей и внуков.

Формат, который я хочу:

 var bookingtrackingsquery = _indondoDBContext.Bookings.Where(bookings => bookings.DestinationId == destinationid)
                                        .Include(bookings => bookings.BookingTypes)
                                        .Include(bookings => bookings.Accommodations)
                                        .Include(bookings => bookings.Bookingtrackings)
                                            .ThenInclude(bookingtrackings => bookingtrackings.Bookingstatus)
                                        .ToList();

Но я застрял на 2 дня в предложении where и или, возможно, groupby, как мой обычный синтаксис linq, и или он даже должен быть там

любая помощь будет очень принята ...

...