2011-08-05 4 views
3

Je suis actuellement en train de réécrire une macro XSLT pour afficher les noeuds enfants de la page en cours, en fonction des variables querystring définies pour 'month' et 'year '. Ceci est utilisé pour une page de listes de nouvelles qui affiche des articles pour une certaine période.Utilisation de Razor LINQ .Where() pour trouver des noeuds umbraco avec une valeur de date donnée

Dans l'ancienne macro, je parcourt et sélectionne les nœuds où la partie mois de la propriété "newsDate" (qui est un champ datepicker) et les affecte à la variable nodelist. $ Displaymonth est collecté à partir de querystring. J'ai des difficultés à créer une liste similaire de nœuds en utilisant une syntaxe de rasoir. En supposant que le mois querystring est Août, je l'ai essayé des choses comme

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

Les erreurs de débogage se plaignent souvent qu'il n'y a pas de propriété « mois » à l'intérieur ma variable Newsdate. Soit cela ou "Aucune propriété ou date de champ n'existe dans le type 'Func`2'". Il semble traiter ma propriété Datepicker comme une chaîne quoi que je fasse, comme décrit here mais j'utilise la dernière version de umbraco.

Comment puis-je trouver des enfants en convertissant le mois/l'année d'une propriété datepicker (un objet DateTime dans Umbraco) et en le comparant à une variable? Comment puis-je même obtenir cette propriété date et extraire le mois/année, alors que dans une déclaration .Where?

+0

'Where' accepte une expression lambda de sorte que vous utilisez une syntaxe incorrecte. Le chercher. –

+0

De plus, il n'y a pas de type de données 'DatePicker' en C# donc je n'ai aucune idée de ce que' newDate' est et je ne peux pas vous donner un exemple. –

+0

http://umbraco.com/follow-us/blog-archive/2011/3/1/umbraco-razor-feature-walkthrough-%E2%80%93-part-4 - "Avec DynamicObject (DynamicNode aussi, car il hérite de), l'analyseur C# compiler/razor ne vous permet pas d'utiliser la syntaxe familière lambda pour filtrer vos ensembles Cela est dû au fait que nous renvoyons maintenant DynamicObject [DynamicNodeList] pour autoriser le chaînage de méthode. " – giles

Répondre

8

Note: Cette forme de La syntaxe LINQ est spécifique aux objets DynamicNode de umbraco (à propos de umbraco v4.7.1)

Si vous utilisez le dictionnaire de valeurs où l'élément dans le dictionnaire est de type DateTime, et que la propriété que vous comparez est une propriété de date, alors une coercition de type est effectuée et vous obtiendrez la fonctionnalité dont vous avez besoin, voici comment je l'ai fait:

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); 
4

Si vous souhaitez utiliser une clause Where Linq vous pouvez le faire: CurrentModel.ChildrenAsList.Where(...) (donc pas modèle, mais CurrentModel ... il est plus facile en studio visuel aussi, vous donne IntelliSense;))

Questions connexes