這是一個後續問題,其中回答了這裏:Excluding dates from Linq Query in MVC .net application - 我非常感謝。在MVC .net應用程序中排除來自Linq查詢集合的行
我希望有人可以在我的Linq查詢中檢查我的語法 - 確認是否構建查詢的最佳方法,或者如果我使用的語法效率低下。
public class Room
{
public int RoomId { get; set; }
[Display(Name = "Room Name")]
public string Name { get; set; }
public bool Disabled { get; set; }
public virtual ICollection<Client> Clients { get; set; }
}
public class Client
{
public int ClientId { get; set; }
public int RoomId { get; set; }
public string ClientName { get; set; }
public DateTime Arrival { get; set; }
public DateTime Departure { get; set; }
public virtual Room Room { get; set; }
}
客戶爲每個預訂了特定房間的客戶列出一行。我有3個房間,房間1,2室和3室所以在客戶表中的條目可能是:
Client 1, Room 1, Mr Smith, Arr: 2012-07-08, Dep: 2012-07-10
Client 2, Room 1, Mr Jones, Arr: 2012-07-14, Dep: 2012-07-20
Client 3, Room 2, Mr Alas, Arr: 2012-07-12, Dep: 2012-07-15
給定一個到達和出發日期,我試圖把我的整個房間的名單,並拿走任何有客戶入住或離開日期重疊的地方。因此,使用上面的數據,如果我的到達日期爲2012-07-12,且出發日期爲2012-07-13,則2號房間將不可用,但是1號房間沒有任何預約日期 - 所以我想留在我的結果集中的房間1。
所以我的Linq查詢(我是新來的LINQ,所以請指出,我可能會錯誤)是:
var dteFrom = DateTime.Parse("2012-07-12");
var dteTo = DateTime.Parse("2012-07-13");
var rooms = (from r in Rooms
where !r.Clients.Any(
client =>
(dteFrom >= client.Arrival && dteFrom <= client.Departure)
||
(dteTo >= client.Arrival && dteFrom <= client.Departure)
||
(dteFrom <= client.Arrival && dteTo >= client.Departure)
)
select r);
鑑於我期待包括所有客房內,除了任何符合標準,任何人都可以確認我使用.Any和!和||是否正確,只要LINQ去?
語法中有沒有更好的方法,從房間列表中排除記錄?
再次感謝您的幫助,
馬克
Thanks @ Dave-Bish - 我沒有意識到Except這個詞,但我同意讓它更具可讀性,對我來說是一個明顯的收穫!歡呼聲,馬克 – Mark 2012-07-06 12:26:15