Using Razor LINQ .Where() to find umbraco nodes with a certain date value
I'm currently rewriting an XSLT macro to display child nodes of the current page, depending on what querystring variables are set for 'month' and 'year'. This is used for a news listings page which displays articles for a certain period.
In the old macro, I am looping through and selecting nodes where the month part of the "newsDate" property (which is a datepicker field) and assigning them to the nodelist variable. $Displaymonth is gathered from 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>
I am having trouble creating a similar list of nodes using razor syntax. Assuming the querystring month is August, I have tried things like
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))
The debug errors mostly complain that there is no property "month" inside my newsDate variable. Either that or "No property or field date exists in type 'F开发者_运维知识库unc`2'". It seems to be treating my Datepicker property as a string whatever I do, as described here but I am using the latest version of umbraco.
How can I find children by converting the month/year of a datepicker property (a DateTime object within Umbraco) and comparing that to a variable? How can I even get this date property and extract the month/year, while inside a .Where statement?
Note: This form of LINQ syntax is peculiar to umbraco DynamicNode objects (from about umbraco v4.7.1)
If you use the values dictionary where the item in the dictionary is of type DateTime, and the property you're comparing against is a date property then some type coercion is performed and you will get the functionality you need, here's how I've done it:
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);
If you want to use a Linq Where clause you can do this: CurrentModel.ChildrenAsList.Where(...)
(so not Model but CurrentModel...it's easier in visual studio too, gives you intellisense ;) )
精彩评论