2009-09-07 22 views
11

Sto utilizzando System.Linq.Dynamic per eseguire le clausole where dove da una chiamata ajax in .Net MVC 1.0.System.Linq.Dynamic e DateTime

Funziona bene per stringhe, int ecc ma non per DateTime, ottengo l'eccezione non può confrontare String a DateTime. Il codice di prova molto semplice è

items = items.Where (string.Format (@ "{0}> {1} {2} {1}", searchField, delimiter, searchString));

Dove searchField sarà ad esempio start_date e il tipo di dati è DateTime, il delimitatore è "(provato anche con niente) e searchString sarà 01-Jan-2009 (provato con 01/01/2009 pure) e voci è un IQueryable da LinqToSql.

c'è un modo di specificare il tipo di dati in una dinamica in cui, o c'è un approccio migliore. e 'attualmente già utilizzando un po' di riflessione per capire che tipo di delimitatore è richiesto.

+1

Mi confonde sempre quando una domanda ha una risposta con un sacco di voti, ma ha 0 upvotes per la domanda stessa. Noioso. Bella domanda, sono arrivato qui perché avevo bisogno della stessa cosa! Venerabile a te, buon signore! – viggity

risposta

18

Penso che sia possibile convertire searchString in DateTime e trasmetterlo come parametro al metodo dinamico in cui si trova

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

Grazie items = items.Where (string.Format ("{0}> @ 0", searchField), new DateTime (2001, 1, 15)); ottimo lavoro –

+0

Fantastico, grazie! –

1

Cosa succede se l'intero lambda viene creato dinamicamente (andremo con uguale anziché maggiore di) e il tipo non è noto? In tal caso non è possibile utilizzare DateTime.Parse nei parametri where. Se si tenta di passare nell'oggetto DateTime, Dynamic LINQ lo interpreta come un tipo int32. Potresti farlo convertendo i tick oi millisecondi di DateTime e confrontandoli prima?

3

ho usato Convert.ToDateTime per risolvere il problema, come sto facendo qualcosa di simile a Kappasims

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

Ho visto questo consiglio su un gruppo, ma non funziona per me - non riesce con 'LINQ alle Entità non riconosce il metodo 'System.DateTime ToDateTime (System.String)'' –

+0

Ho lo stesso problema con quel consiglio. In quale server SQL funziona? –

3

Se si vuole fare questo con solo il formato Where([string]), non passando in altre paramaters, è possibile utilizzare il formato della data Date(yyyy, mm, dd). Così mi è stato in grado di ottenere questo lavoro facendo

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

C'è una specifica completa here che delinea l'analisi e l'utilizzi validi.

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