【问题标题】:Using Razor LINQ .Where() to find umbraco nodes with a certain date value使用 Razor LINQ .Where() 查找具有特定日期值的 umbraco 节点
【发布时间】:2011-08-05 11:44:56
【问题描述】:

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

在旧的宏中,我循环并选择“newsDate”属性的月份部分(这是一个日期选择器字段)所在的节点,并将它们分配给节点列表变量。 $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>

我在使用 razor 语法创建类似的节点列表时遇到问题。假设查询字符串月份是八月,我尝试过类似

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 变量中没有属性“月”。或者“'Func`2'类型中不存在属性或字段日期”。无论我做什么,它似乎都将我的 Datepicker 属性视为一个字符串,如 here 所述,但我使用的是最新版本的 umbraco。

如何通过转换 datepicker 属性(Umbraco 中的 DateTime 对象)的月/年并将其与变量进行比较来找到孩子?在 .Where 语句中,我什至如何获取此日期属性并提取月/年?

【问题讨论】:

  • Where 接受 lambda 表达式,因此您使用了错误的语法。查一下。
  • 另外,C# 中没有 DatePicker 数据类型,所以我不知道 newDate 是什么,也不能举个例子。
  • umbraco.com/follow-us/blog-archive/2011/3/1/… - “对于 DynamicObject(DynamicNode 也是,因为它继承自),c# 编译器/razor 解析器不允许您使用熟悉的 lambda 语法来过滤您的集合。这是因为我们现在返回一个 DynamicObject [DynamicNodeList] 以允许方法链接。”
  • Datepicker 只是一个 DateTime 对象,在 CMS 中嵌入了日历控件

标签: c# razor umbraco


【解决方案1】:

注意:这种形式的 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);

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-07
      相关资源
      最近更新 更多