Как вложить условия условия WHERE с помощью Kentico Pages API без использования необработанных строк SQL? - PullRequest
0 голосов
/ 17 октября 2018

Я бы хотел использовать API страниц Kentico для воссоздания этого предложения SQL Where и сохранения скобок без изменений для измененного порядка операций:

WHERE ((EventEnd IS NULL OR EventEnd = '') AND EventStart < getdate()) 
     OR EventEnd < getdate()

Примечание. Не переставлять этот примерработать правильно без скобок, потому что мой вопрос касается создания сложных условий с круглыми скобками с помощью 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 голосов
/ 17 октября 2018

Ответ Брендена указал мне на документацию Kentico о вложенных условиях WHERE.

Следующий ответ - это то, что я использую для точного соответствия требованиям условия WHERE, изложенным в вопросе, используя вложенные условия WHERE через API:

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.Вы можете играть с условием, чтобы увидеть различные результаты.См. Полный вывод ниже.

Сгенерированный вывод предложения SQL WHERE, полученный путем вызова pagesQuery.ToString(true), таков.Он включает в себя все мои условия (во второй строке вывода) и условия 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')
0 голосов
/ 17 октября 2018

Вы должны иметь возможность добавлять вложенные WhereCondition, например, так:

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

Ссылка Kentico docs https://docs.kentico.com/k11/custom-development/retrieving-database-data-using-objectquery-api#RetrievingdatabasedatausingObjectQueryAPI-Nestedwhereconditions

...