Umbraco 7 LINQ在日期范围内过滤Model子项

时间:2018-10-30 20:51:06

标签: c# linq umbraco umbraco7

我在Umbraco 7中收集了跨越多年的文章,并想编写一个简单的LINQ查询来获取当年的项目:

var press =  Model.Content.Children.Where(w => Convert.ToDateTime(w.GetPropertyValue("publicationDate")) >= new Date(1,1,2018));

这将导致错误:

  

代理'System.Func'不接受1个参数。

我正在考虑仅将数据捆绑在T列表中-除非有人可以通过对Umbraco内容节点进行过滤将我引向正确的方向?

谢谢。

2 个答案:

答案 0 :(得分:3)

我在想像这样的东西对我来说看起来更“正确”,但是未经测试。需要注意的一件事是,我确保直接从Umbraco将该属性获取为DateTime的方式。而且我还想将它与DateTime而不是Date进行比较可能会有所不同。

var press =  Model.Content.Children.Where(w => w.GetPropertyValue<DateTime>("publicationDate") >= new DateTime(2018,1,1));

答案 1 :(得分:1)

您的问题是您使用的是Date而不是DateTimeDate不是标准的.NET类型-它很可能来自您在项目中引用的其他DLL。

这意味着它与DateTime不具有可比性,后者是从Umbraco提取数据时要转换为的数据类型(也是我们在Umbraco内部存储日期的类型)。

如另一个答案中所述,您还应该使用.GetPropertyValue<DateTime>()方法来让Umbraco为您完成转换。这样会简化您的代码。

除此之外-如果您只是将查询更改为使用DateTime而不是Date,那么您的查询就可以正常工作-我已经验证了自己。

请考虑将日期首先放在变量中,以避免在DateTime内实例化Where的新实例:

var currentYear = new DateTime(2018, 1, 1);
var press =  Model.Content.Children.Where(x => x.GetPropertyValue<DateTime>("publicationDate") > currentYear);

// or your way:
var press =  Model.Content.Children.Where(w => Convert.ToDateTime(w.GetPropertyValue("publicationDate")) >= date);