12
votes

System.Linq.dynamic et DateTime

J'utilise System.Linq.Dynnamic à faire sur mesure où des clauses d'un appel AJAX dans .NET MVC 1.0.

Cela fonctionne bien pour les chaînes, INT, mais pas pour DateTime, je reçois l'exception ne peut pas comparer la chaîne à DateTime. Le code de test très simple est

éléments = éléments.Où (string.format (@ "{0}> {1} {2} {1}", SearchField, Délimiteur, SearchString));

où Searchfield sera par exemple start_date et le type de données est DateTime, Délimiteur est "(Essayé avec rien de même) et la recherchetring sera 01-janv. 2009 (essayé avec 01/01/2009) et les articles sont un iquishisable de Linqtosql.

existe-t-il un moyen de spécifier le type de données dans une dynamique où, ou y a-t-il une meilleure approche. Il utilise actuellement certaines réflexions pour déterminer le type de délimiteur requis.


1 commentaires

Il vous confond toujours l'enfer de moi lorsqu'une question a une réponse avec une tonne de prostituées, mais a 0 upvotes pour la question elle-même. Boiteux. Bonne question, je suis arrivé ici parce que j'avais besoin de la même chose! Upvote à vous, bon monsieur!


5 Réponses :


19
votes

Je pense que vous pouvez convertir la recherche de recherche à une date d'heure et transmettez-la sous forme de paramètre sur la dynamique où la méthode elle-même.

itmes = items.Where( string.Format( "{0} > @0", searchField ),
                     DateTime.Parse( searchString ) );


1 commentaires

Merci articles = Articles.Où (string.format ("{0}> @ 0", Searchfield), nouvelle DateTime (2001, 1, 15)); a travaillé super



1
votes

Et si l'ensemble de la Lambda est créé de manière dynamique (nous irons avec des égaux au lieu de supérieurs à) et le type n'est pas connu? Dans ce cas, vous ne pouvez pas utiliser DateTime.parse dans le lieu où les paramètres. Si vous essayez de transmettre l'objet DateTime, Dynamic Linq l'interprète en tant que type INT32. Pourriez-vous éventuellement le faire en convertissant d'abord les tiques ou les millisecondes de la DateTime et en comparant cela?


0 commentaires

3
votes

J'ai utilisé convert.TodateTetime pour résoudre le problème, car je fais quelque chose de similaire à Kappasims

items = items.Where(string.Format("{0} > Convert.ToDateTime(\"{1}\")", searchField, searchValue); 


2 commentaires

J'ai vu ce conseil autour d'un groupe, mais cela ne fonctionne pas pour moi - échoue avec Linq aux entités ne reconnaît pas la méthode 'System.DateTime toDateTime (System.String)'


J'ai le même problème avec ce conseil. Dans lequel SQL Server qui fonctionne?



3
votes

Si vous voulez faire cela avec juste le format où ([string]) ([string]), vous ne pouvez pas passer à d'autres paramètres, vous pouvez utiliser le format de date date (aaaa, mm, dd) code>. J'ai donc pu obtenir ce travail en faisant

items.Where("DateAdded > Date(2013, 06, 18)")


0 commentaires

6
votes
yourlist.Where("PostDate > DateTime(2013, 07, 24)");

0 commentaires