使用Razor LINQ . where()查找具有特定日期值的umbraco节点

本文关键字:日期 节点 umbraco LINQ Razor where 查找 使用 | 更新日期: 2023-09-27 18:04:41

我目前正在重写一个XSLT宏来显示当前页面的子节点,具体取决于为'month'和'year'设置了哪些查询字符串变量。这用于新闻列表页面,该页面显示特定时期的文章。

在旧的宏中,我循环并选择"newsDate"属性(这是一个日期拾取器字段)的月份部分的节点,并将它们分配给nodelist变量。$Displaymonth从querystring中收集。

<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>

我在使用razor语法创建类似的节点列表时遇到了麻烦。假设查询字符串month是August,我尝试了像

这样的东西
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。

我如何通过转换日期拾取器属性的月/年(在Umbraco中的DateTime对象)并将其与变量进行比较来找到孩子?我怎么能得到这个日期属性和提取月/年,而在一个。where语句?

使用Razor LINQ . where()查找具有特定日期值的umbraco节点

注意:这种形式的LINQ语法是umbraco DynamicNode对象所特有的(从大约umbraco v4.7.1开始)

如果你使用values字典,而字典中的项是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);

如果你想使用Linq Where子句,你可以这样做:CurrentModel.ChildrenAsList.Where(...)(所以不是模型,而是CurrentModel…在visual studio中也更容易,给你智能感知;))