使用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语句?
注意:这种形式的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中也更容易,给你智能感知;))