2012-07-06 52 views
0

這是一個後續問題,其中回答了這裏: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去?

語法中有沒有更好的方法,從房間列表中排除記錄?

再次感謝您的幫助,

馬克

回答

0

看起來好像沒什麼問題 - 一兩件事,可能有助於可讀性將撰寫查詢分爲兩步:

var prebookedRooms = rooms 
    .Where(room => room.Clients.Any(client => 
    (dteFrom >= client.Arrival && dteFrom <= client.Departure) || 
    (dteTo >= client.Arrival && dteFrom <= client.Departure) || 
    (dteFrom <= client.Arrival && dteTo >= client.Departure))); 

var freeRooms = rooms.Except(prebookedRooms); 

記住只有當枚舉結果時纔會執行查詢 - 所以沒有性能成本來分兩步執行此操作。

+0

Thanks @ Dave-Bish - 我沒有意識到Except這個詞,但我同意讓它更具可讀性,對我來說是一個明顯的收穫!歡呼聲,馬克 – Mark 2012-07-06 12:26:15