Использование Razor LINQ .Where () для поиска узлов Umbraco с определенным значением даты - PullRequest
3 голосов
/ 05 августа 2011

В настоящее время я переписываю макрос XSLT для отображения дочерних узлов текущей страницы в зависимости от того, какие переменные строки запроса установлены для «месяц» и «год».Это используется для страницы списков новостей, которая отображает статьи за определенный период.

В старом макросе я перебираю и выбираю узлы, где указывается часть месяца свойства "newsDate" (которое является полем datepicker) и присвоение их переменной списка узлов.$ Displaymonth получено из строки запроса.

<xsl:for-each select="$currentPage/*[@isDoc]">
          <xsl:sort order="descending" select="newsDate" data-type="text"/>
          <xsl:if test="umbraco.library:FormatDateTime(newsDate, '%M') = $displayMonth">
            <xsl:copy-of select="." />
          </xsl:if>
</xsl:for-each>

У меня проблемы с созданием аналогичного списка узлов с использованием синтаксиса бритвы.Предполагая, что месяц строки запроса - август, я пробовал что-то вроде

Model.Children.Where(umbraco.library.FormatDateTime(newsDate,'M') + " == 8");
Model.Children.Where("Convert.ToDateTime(newsDate).Month == \"8\"");
Model.Children.Where("newsDate.Month == \"8\"");
Model.Children.Where("newsDate.Value.Month == \"8\"");
Model.Children.Where(i=>Convert.ToDateTime(i.GetProperty("newsDate").Value).Month==8))

. Ошибки отладки в основном жалуются на то, что в моей переменной newsDate нет свойства "month".Либо это, либо «Отсутствует свойство или дата поля в типе« Func`2 »».Кажется, что мое свойство Datepicker обрабатывается как строка, что бы я ни делал, как описано здесь , но я использую последнюю версию umbraco.

Как найти детей, конвертируя месяц /год свойства datepicker (объект DateTime в Umbraco) и сравнение его с переменной?Как я могу даже получить это свойство даты и извлечь месяц / год, находясь внутри оператора .Where?

Ответы [ 2 ]

8 голосов
/ 16 ноября 2011

Примечание. Эта форма синтаксиса LINQ свойственна объектам Umbraco DynamicNode (примерно из Umbraco v4.7.1)

Если вы используете словарь значений, в котором элемент в словаре имеет тип DateTime, а свойство, с которым вы сравниваете, является свойством даты, тогда выполняется какое-то приведение типов, и вы получаете необходимую вам функциональность, вот как я сделали это:

var values = new Dictionary<string,object>();
values.Add("queryStartDate", DateTime.Parse(Request["queryStartDate"])) ;
values.Add("queryEndDate", DateTime.Parse(Request["queryEndDate"])) ;
var results = Model.Children.Where("newsDate > queryStartDate && newsDate < queryEndDate", values);
4 голосов
/ 22 сентября 2011

Если вы хотите использовать предложение Linq Where, вы можете сделать это: CurrentModel.ChildrenAsList.Where(...) (т.е. не Model, а CurrentModel ... это проще в Visual Studio, дает вам intellisense;))

...