C# 在MVC.net应用程序中从Linq查询的集合中排除行
这是这里回答的问题的后续问题:-我非常感谢 我希望有人能在下面的Linq查询中检查我的语法,以确认这是构建查询的最佳方式,还是我对语法的使用效率低下C# 在MVC.net应用程序中从Linq查询的集合中排除行,c#,linq,entity-framework,C#,Linq,Entity Framework,这是这里回答的问题的后续问题:-我非常感谢 我希望有人能在下面的Linq查询中检查我的语法,以确认这是构建查询的最佳方式,还是我对语法的使用效率低下 public class Room { public int RoomId { get; set; } [Display(Name = "Room Name")] public string Name { get; set; } public bool Disabled { get; set; }
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; }
}
给定一个到达和离开的日期,我试着把我所有的房间都拿出来,把那些有客户在到达或离开日期重叠的地方住宿的房间都拿走。因此,使用上述数据,如果我的到达日期为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);
鉴于我希望包括所有房间,除了任何符合标准的房间,有人能确认我使用的。任何和!就LINQ而言,| |是正确的吗
在语法中是否有更好的方法将记录从文件室列表中排除
再次感谢您的帮助
Mark在我看来很好-一件可能有助于可读性的事情是分两步编写查询:
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);
请记住,查询只在枚举结果时执行-因此分两步执行不会带来性能损失。谢谢@Dave Bish-我不知道Except这个词,但我同意让它更可读,对我来说是一个明确的收获!干杯,马克
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);