2016-05-20 5 views
0

私はホテル管理システムを構築する必要があるC#クラスで最終的なプロジェクトを行っていますが、現在2つの日付の間に部屋がすでに予約されているかどうかをチェックしています。私自身でそれを理解しようとしましたが、このクエリ文字列をLINQに変換する方法がわかりません。このクエリ文字列をLINQ to SQLクエリに変換する方法?

助けが必要ですか?

query = "SELECT * FROM Suites WHERE SuiteType = " + suitetype + " AND NumberOfAdultsAllowed >= " + adults + " AND NumberOfChildrenAllowed >= " + children + " AND "; 
query += "Suites.SuiteNumber NOT IN (SELECT SuiteNumber FROM Bookings WHERE "; 
query += "(StartDate BETWEEN @_start AND @_end) OR "; 
query += "(EndDate BETWEEN @_start AND @_end) OR "; 
query += "(@_start BETWEEN StartDate and EndDate) OR "; 
query += "(@_end BETWEEN StartDate and EndDate) OR "; 
query += "(@_start <= StartDate and @_end >= EndDate) OR "; 
query += "(@_start >= @_end))"; 

私が最初に

var querySearch = from q in db.Suites 
        where q.SuiteType == suitetype 
        select q; 

ですべての部屋を取得して、スイート番号がテーブルBookingsで、それが指定した日付の間にある場合であるかどうかを確認する別のクエリに対してそれをチェックすることを考えました。

しかし、私は毎回失います。

+0

完全に優れたSQL文をLinqに変換する理由は何ですか?最終プロジェクトにLinqを使用する必要がありますか? –

+0

@MichaelZ。はい、LINQ to SQLを要件の1つとして使用する必要があります。それ以外の場合は単純なSQLを使用します。 – Denis

答えて

1

これはかなり基本的です。唯一のしわは、次のように行うことができるサブセレクトです。

予約ロジックの中には、少し冗長なものがあります。開始日と終了日の間にある日付が開始日または終了日の間にないことは不可能です。だからこれを少し減らすことができます。

また、最後または条件は、開始後に終了する日付が含まれるため、ほとんどすべての以前のロジックを無効にします。

注:これはテストされていませんが、動作するはずです。

var bookings = from b in db.Bookings 
       where (b.StartDate >= start && b.StartDate <= end) 
       || (b.EndDate >= start && b.EndDate <= end) select b.SuiteNumber; 

var querySearch = from q in db.Suites 
       where q.SuiteType == suitetype 
       && q.NumberOfAdultsAllowed >= adults 
       && q.NumberOfChildrenAllowed >= children 
       && !bookings.Contains(q.SuiteNumber) 
       select q; 
+0

'.Except(...) 'を使用しないでください。 –

+0

SQL文を複数のLinqクエリに分割する必要がある場合は、おそらくそれが価値がありません。あなたは実際にSQLを使用した場合よりも、実際にはより多くの処理を行っています。おそらくSQLを実行し、返されたDataTableに対してLinqを使用します。 –

+1

@MichaelZ。たぶん、私が知っている限り、あなたがToListなどを呼び出さない限り、クエリは実行されません。私はこれについて間違っていない限り、複数のコード行で1つのクエリを実行できますか?リストされたコードの両方の行でも、結果がフェッチされるか反復されるまで、実際にはSQLは実行されません。 –

関連する問題