Subsonic 2.2 SqlQuery具有复杂的子句

时间:2012-06-22 15:18:10

标签: c# subsonic

我为资源调度日历应用编写了以下查询。该查询用于查找已在日历上安排的任何与感兴趣事件冲突的事件:

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

        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写这个查询?

1 个答案:

答案 0 :(得分:1)

如果我没错,EventX.Schema.TableNameEventX.Columns.xyz只是常量,实际变量是startTimeendTimeeventId对吗? 如果是这样,为什么不进行存储过程,或至少是参数化查询,以便SQL可以缓存执行计划? IIRC亚音速支持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 3.0大约两个月前发布,现在感觉已经死了。 Rob Connery自从创建了Massive,如果我是正确的话,几乎放弃了Subsonic ......

修改

只是说清楚:我不是说亚力克是坏的,使用和调整它的T4模板很多,以满足我的需要。大约2年前。但是很多人都不熟悉它,所以转向其他更广为人知的数据访问技术......