我是 .NET-Core 和構建 API 的新手,但遇到了一個問題。我正在制作一個(Android)應用程式,人們可以在其中計劃活動/生日派對或其他事情。用戶可以在填寫開始和結束日期/時間后檢索可用(預先添加)場地/位置的串列。這是我卡住的部分。
我想要在他們填寫開始和結束日期后的可用場地串列,僅顯示所選時間段的可用場地。
我的 API 中有 2 個模型,一個“Venue”模型和一個“VenueReservation”模型。
Venue 模型具有 ID、位置和名稱。VenueReservationModel 有一個 Id、venueId、startDateTime、endDateTime。
根據用戶的 DateTime 輸入(開始和結束日期時間),我可以使用或做什么來檢索可用場地?
我使用 Enumerable.Where 方法玩弄 LINQ,但似乎找不到答案。
提前致謝!
uj5u.com熱心網友回復:
所以你有這樣的課程:
class Venue
{
public int Id {get; set;}
public string Location {get; set;}
public string Name {get; set;}
}
class VenueReservation
{
public int Id {get; set;}
public int VenueId {get; set;} // foreign key to Venue
public DateTime StartDateTime {get; set;}
public DateTime EndDateTime {get; set;}
}
你有:
IQueryable<Venue> Venues => ... // Probably DbSet<Venue>
IQueryable<VenueReservation> VenueReservations => ...
我想要在他們填寫開始和結束日期后的可用場地串列,僅顯示所選時間段的可用場地。
因此,您需要獲取“具有零個或多個 VenueReservations 的場所”。獲得它們后,您只能保留那些在所選時間段內根本沒有預訂的場地。
通過他們的預訂獲得場地
通常要獲得“具有零個或多個 VenueReservations 的場所”,我會使用Queryable.GroupJoin. 有人提到.net core 不支持GroupJoin。在這種情況下,使用左外連接后跟 GroupBy:
var venuesWithTheirReservations = venues.GroupJoin(venueReservations,
venue => venue.Id, // from every Venue take the Id
venueReservation => venueReservation.VenueId, // from every Reservation take the foreign key
(venue, reservationsForThisVenue) => new
{
Venue = venue,
Reservations = reservationsForThisVenue,
});
或LINQ 左外連接后跟 GroupBy:
var venuesWithTheirReservations = from venue in venues
join reservation in venueReservations
on venue.Id equals reservation.VenueId into g
from reservationForThisVenu in g.DefaultIfEmpty()
select new
{
Venue = venue,
Reservation = reservationForThisVenue,
})
.GroupBy(joinResult => joinResult.Venue,
// parameter resultSelector: for every venue, and all reservations for this venue
// make one new
(venue, reservationsForThisVenue) => new
{
Venue = venue,
Reservations = reservationsForThisVenue,
});
僅保留可用場地
因此,現在您已經獲得了場地,每個場地都有他們的預訂,您可以使用Queryable.Where僅保留那些在時間段內完全沒有預訂的場地。
換句話說:沒有一個 Reservations 應該與時隙重疊。
- 所有預訂都應在時間段開始之前結束(=完整的預訂在時間段之前)
- 或在時隙結束后開始(= 完整的預訂在時隙之后。
我們不希望部分時間段內的預訂
所以繼續LINQ:
DateTime timeSlotStart = ...
DateTime timeSlotEnd = ...
var availableVenues = venuesWithTheirReservations.Where(venue =>
// every Reservation should end before timeSlotStart
// OR start after the timeSlotEnd:
venue.Reservations.All(reservation =>
// end before timeSlotStart OR
reservation.EndDateTime <= timeSlotStart ||
// start after the timeSlotEnd:
reservation.StartDatetime >= timeSlotEnd));
uj5u.com熱心網友回復:
你可以這樣做。
獲取輸入日期介于開始和結束之間的預訂
IEnumerable<VenueReservation> reservationsBetweenStartAndEnd = venueReservations
.Where(x => inputDateTime > x.StartDateTime && inputDateTime < x.EndDateTime);
獲取輸入日期在開始和結束之外的預訂
IEnumerable<VenueReservation> reservationsOutsideStartAndEnd = venueReservations
.Where(x => inputDateTime < x.StartDateTime || inputDateTime > x.EndDateTime);
如果您想嚴格比較日期并減少小時和分鐘,您可以簡單地在 DateTime 上使用 .Date。
所以作為一個例子,你會這樣做
IEnumerable<VenueReservation> reservationsBetweenStartAndEnd = venueReservations
.Where(x => inputDateTime.Date > x.StartDateTime.Date && inputDateTime.Date < x.EndDateTime.Date);
uj5u.com熱心網友回復:
還
List<VenueReservation> reservationsBetweenStartAndEnd = venueReservations
.Where(x => inputDateTime.Date > x.StartDateTime.Date && inputDateTime.Date < x.EndDateTime.Date).toLis();
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/332941.html
下一篇:在物件陣列中轉換字串
