У меня проблема с переводом моего рабочего запроса SQL в запрос метода Linq. Кажется, я не могу понять, как фильтровать родительские записи на основе Max (date) в дочерних записях.
щелкните, чтобы увеличить
Рабочие 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, и или он даже должен быть там
любая помощь будет очень принята ...