0

これは、 MVC .net アプリケーションの Linq Query から日付を除外するという回答のフォローアップの質問です。これには非常に感謝しています。

以下の 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; } 
} 

クライアントは、特定の部屋を予約した各クライアントの行をリストします。Room 1、Room 2、Room 3 の 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

私には問題ないように見えます-読みやすさに役立つ可能性のあることの1つは、クエリを2つのステップで作成することです。

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

クエリは結果が列挙されたときにのみ実行されることに注意してください。したがって、これを 2 つのステップで実行してもパフォーマンス コストはかかりません。

于 2012-07-06T12:06:00.607 に答える