0

リソース スケジューリング カレンダー アプリ用に次のクエリを作成しました。クエリは、関心のあるイベントと競合するカレンダーで既にスケジュールされているイベントを見つけるために使用されます。

        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 を使用してこのクエリをどのように記述しますか?

4

1 に答える 1

1

私が正しければ、EventX.Schema.TableName単なる定数でありEventX.Columns.xyz、実際の変数はですstartTimeよね? もしそうなら、SQL が実行プランをキャッシュできるように、ストアド プロシージャ、または少なくともパラメーター化されたクエリを作成してみませんか? IIRC Subsonic は SP をサポートしていますが、プロジェクト サイトは崩壊寸前のようです。endTimeeventId

次のような SQL は、SP またはパラメーター化されたクエリである可能性があります。

 SELECT * FROM EventTable
 WHERE 
        ( 
            ( 
                 StartTime >= @startTime 
                  AND StartTime < @endTime 
            ) 
             OR 
            (
                 EndTime > @startTime 
                  AND EndTime <= @endTime 
            )
        )
        AND
        (
            EventID <> @eventId
             AND 
            StatusID IN ( 1,2 ) 
            --just made up these numbers, should be the ID of Approved and Completed ...
        )

@startTime@endTimeおよび@eventIdパラメータとして渡しますか?

あなたのプロジェクトの状況はわかりませんが、もし私があなたの立場だったら、おそらく、正しく機能しているものはそのままにしておこうと思うでしょう。Subsonic を世界で積極的に使用されているもの、または使用経験のあるものにゆっくりと置き換えてみてください。あなたにとっても、後でそれを維持しなければならない人にとっても良いでしょう。

Subsonic 3.0 は約 2 年前にリリースされましたが、今ではほとんど死んでいるように感じます。それ以来、ロブ・コネリーはマッシブを作成し、私が正しければサブソニックをほとんど放棄しました...

編集

明確にするために: Subsonic が悪いと言っているのではなく、私のニーズに合わせて T4 テンプレートを使用し、微調整しました。約2年前。しかし、多くの人がそれに慣れていないため、他のより広く知られているデータ アクセス手法に移行しました...

于 2012-06-22T19:01:25.143 に答える