这是对此处回答的问题的后续问题:Excluding dates from Linq Query in MVC .net application - 我非常感谢。
我希望有人可以在下面的 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 年 7 月 12 日,出发日期为 2012 年 7 月 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而言是正确的吗?
语法中有没有更好的方法,从房间列表中排除记录?
再次感谢您的帮助,
标记