我想使用Kentico Pages API重新创建此SQL Where子句并保持括号完整以适应更改的操作顺序:
WHERE ((EventEnd IS NULL OR EventEnd = '') AND EventStart < getdate())
OR EventEnd < getdate()
注意:请不要重新排列此示例以使其在没有括号的情况下正常工作,因为我的问题是使用Pages API使用括号生成复杂条件。
此示例基于理论上的日历事件页面类型,该类型具有:
此WHERE子句的目的是通过查找过去的开始日期(如果不存在结束日期值)来过滤过去的事件;否则,它将查找过去的结束日期值。
但是,我找不到很好的Kentico示例,说明如何在不将原始SQL字符串放入页面查询中的情况下实现这种条件嵌套(此操作可以完成)。
相反,我正在寻找一种聪明的方法来使用.Where(..)
,.And(..)
,.Or(..)
和其他相关的API方法来生成上面的WHERE子句,并完整地改变操作顺序。 WhereBuilder
类看起来也很有前途,但似乎不适合页面查询流程。
这是一个Pages查询的示例,我试图在其中重新创建上述WHERE子句而又不为这些条件添加原始SQL字符串:
using CMS.DataEngine;
using CMS.DocumentEngine;
using CMS.Helpers;
using CMS.Base;
var pages = new TreeProvider().SelectNodes()
.Published()
.OnSite(MySiteName)
.Types(CalendarEventPageType)
.NestingLevel(1)
.Path(calendarEventsPath, PathTypeEnum.Children)
/* Looking for clever code after this line...
How do I group these methods to get the desired order of operations with parenthesis?
*/
.Where(..)
.And(..)
.Or(..);
答案 0 :(得分:1)
您应该可以像这样添加嵌套的WhereCondition
:
.Where(new WhereCondition()
.WhereNull("EventEnd")
.Or()
.WhereEmpty("EventEnd")
.And()
.WhereLessThan("EventStart", DateTime.Now)
)
.Or()
.WhereLessThan("EventEnd", DateTime.Now);
答案 1 :(得分:1)
Brenden的回答将我引向了有关嵌套WHERE条件的Kentico文档。
以下答案是我通过API使用嵌套WHERE条件来完全符合问题中所述的WHERE子句要求的条件:
DateTime rightNow = DateTime.Now;
var pagesQuery = tree.SelectNodes()
.OnSite(Mysite)
.Types(CalEventPageType)
.Path("/Events/Calendar", PathTypeEnum.Children)
.NestingLevel(1)
/* My WHERE Conditions: */
.Where(w1 => w1.Where(w => w.WhereEmpty("EventEnd").And().WhereLessThan("EventStart", rightNow))
.Or().WhereLessThan("EventEnd", rightNow))
.OrderBy(OrderDirection.Descending, "EventStart")
.Culture("en-ca");
外部w1
似乎很琐碎,但是需要在我所有生成的条件周围加上一组外部括号,以免与Kentico的过程冲突。您可以使用条件查看各种结果。请参阅下面的完整输出。
通过调用pagesQuery.ToString(true)
获取的生成的SQL WHERE子句输出是这个。它包括我的所有条件(在输出的第二行中)和Kentico的条件(所有其他行):
WHERE [NodeSiteID] = 1 AND
/* My WHERE Conditions: */
((([EventEnd] = N'' OR [EventEnd] IS NULL) AND [EventStart] < '10/16/2018 10:02:13 PM') OR [EventEnd] < '10/16/2018 10:02:13 PM')
AND (([DocumentCanBePublished] = 1
AND ([DocumentPublishFrom] IS NULL OR [DocumentPublishFrom] <= '10/16/2018 10:02:13 PM')
AND ([DocumentPublishTo] IS NULL OR [DocumentPublishTo] >= '10/16/2018 10:02:13 PM'))
AND [NodeAliasPath] LIKE N'/Events/Calendar/%'
AND [NodeLevel] <= 3 AND [DocumentCulture] = N'en-ca')