リソース スケジューリング カレンダー アプリ用に次のクエリを作成しました。クエリは、関心のあるイベントと競合するカレンダーで既にスケジュールされているイベントを見つけるために使用されます。
string qry = "SELECT * FROM " + EventX.Schema.TableName +
" WHERE " +
" ( " +
" ( " +
EventX.Columns.StartTime + " >= '" + startTime +
"' AND " + EventX.Columns.StartTime + " < '" + endTime +
"' ) " +
" OR " +
" ( " +
EventX.Columns.EndTime + " > '" + startTime +
"' AND " + EventX.Columns.EndTime + " <= '" + endTime +
"' ) " +
" ) " +
" AND " +
" ( " +
EventX.Columns.EventID + " <> " + eventId +
" AND " + EventX.Columns.StatusID + " IN " +
" ( " +
(int) EventStatus.Approved + " , " +
(int) EventStatus.Completed +
" ) " +
" ) ";
QueryCommand qc = new QueryCommand(qry, EventX.Schema.Provider.Name);
EventXCollection events = new EventXCollection();
events.LoadAndCloseReader(DataService.GetReader(qc));
上記のクエリは機能しますが、美学の観点からは非常に醜い忌まわしきものであり、私の後にこれを維持しなければならない人に混乱を残したくありません. 代わりに SqlQuery を使用して動作させようとして失敗した後、このクエリを作成しました。SqlQuery をあきらめて、上記の機能的だが醜いハックを書く前に、私がそれを正しく理解することに最も近かったのは、次の (間違った) クエリでした。
SqlQuery qry = new Select().From(EventX.Schema.TableName);
qry.WhereExpression(EventX.Columns.StartTime).IsGreaterThan(startTime);
qry.And(EventX.Columns.StartTime).IsLessThan(endTime);
qry.OrExpression(EventX.Columns.EndTime).IsGreaterThan(startTime);
qry.And(EventX.Columns.EndTime).IsLessThan(endTime);
qry.AndExpression(EventX.Columns.EventID).IsNotEqualTo(eventId);
qry.And(EventX.Columns.StatusID).In((int)EventStatus.Approved, (int)EventStatus.Completed);
私は、別の開発者によって書かれたアプリケーションの保守に取り組んでおり、Subsonic を使用するのはこれが初めての経験です。イベント A が午後 2:00 に終了し、イベント B が午後 2:00 に開始する場合、イベント A と B はスケジュールの競合を構成せず、クエリはそれを反映する必要があることに注意してください。Subsonic を使用してこのクエリをどのように記述しますか?