C# 在MVC.net应用程序中从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; }

这是这里回答的问题的后续问题:-我非常感谢

我希望有人能在下面的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; } 
} 
给定一个到达和离开的日期,我试着把我所有的房间都拿出来,把那些有客户在到达或离开日期重叠的地方住宿的房间都拿走。因此,使用上述数据,如果我的到达日期为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);