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 并编写上面的功能但丑陋的 hack 之前,我最接近正确的是以下(不正确的)查询:

        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只是常量,而实际变量是startTimeendTimeeventId吗?如果是这样,为什么不创建一个存储过程,或者至少是一个参数化查询,以便 SQL 可以缓存执行计划?IIRC Subsonic 支持 SP,但项目站点看起来快要崩溃了。

类似这样的 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 大约在两年前发布,现在感觉已经死了。Rob Connery 从那以后创建了 Massive,如果我是正确的,几乎放弃了 Subsonic……

编辑

澄清一下:我并不是说 Subsonic 不好,使用和调整了它的 T4 模板来满足我的需要。大约2年前。但不是很多人熟悉它,所以转向其他更广为人知的数据访问技术......

于 2012-06-22T19:01:25.143 回答