我为资源调度日历应用编写了以下查询。该查询用于查找已在日历上安排的任何与感兴趣事件冲突的事件:
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写这个查询?
答案 0 :(得分:1)
如果我没错,EventX.Schema.TableName
和EventX.Columns.xyz
只是常量,实际变量是startTime
,endTime
和eventId
对吗?
如果是这样,为什么不进行存储过程,或至少是参数化查询,以便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年前。但是很多人都不熟悉它,所以转向其他更广为人知的数据访问技术......