我为资源调度日历应用程序编写了以下查询。该查询用于查找日历上已安排的与感兴趣的事件发生冲突的任何事件:
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 编写此查询?