0

这是对此处回答的问题的后续问题: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而言是正确的吗?

语法中有没有更好的方法,从房间列表中排除记录?

再次感谢您的帮助,

标记

4

1 回答 1

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);

请记住,仅在枚举结果时才执行查询 - 因此分两步执行此操作不会产生性能成本。

于 2012-07-06T12:06:00.607 回答