如何使用Kentico Pages API嵌套WHERE子句条件而不使用原始SQL字符串?

时间:2018-10-16 22:35:05

标签: kentico

我想使用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(..);

2 个答案:

答案 0 :(得分:1)

您应该可以像这样添加嵌套的WhereCondition

.Where(new WhereCondition()
        .WhereNull("EventEnd")
        .Or()
        .WhereEmpty("EventEnd")
        .And()
        .WhereLessThan("EventStart", DateTime.Now)
    )
.Or()
.WhereLessThan("EventEnd", DateTime.Now);

参考Kentico文档 https://docs.kentico.com/k11/custom-development/retrieving-database-data-using-objectquery-api#RetrievingdatabasedatausingObjectQueryAPI-Nestedwhereconditions

答案 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')