2009-09-07 9 views
11

Estoy usando System.Linq.Dynamic para hacer cláusulas custom donde desde una llamada ajax en .Net MVC 1.0.System.Linq.Dynamic y DateTime

Funciona bien para strings, int etc pero no para DateTime, obtengo la excepción no puedo comparar String to DateTime. El código de prueba muy simple es

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

Donde searchField será por ejemplo start_date y el tipo de datos es DateTime, delimiter es "(probado con nada también) y searchString será 01-ene-2009 (intentado con 01/01/2009 también) y elementos es IQueryable de LinqToSql.

¿existe una forma de especificar el tipo de datos en una dinámica en la que, o hay un mejor enfoque. en la actualidad está ya utilizando algún reflexión para averiguar qué tipo de delimitador se requiere.

+1

Siempre me confunde cuando una pregunta tiene una respuesta con un montón de votos positivos, pero tiene 0 votos positivos para la pregunta en sí. Cojo. Buena pregunta, ¡llegué aquí porque necesitaba lo mismo! ¡Voto a usted, buen señor! – viggity

Respuesta

18

Creo que puede convertir el searchString a DateTime y pasarlo como un parámetro para el método dinámico donde.

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

, gracias artículos = items.Where (string.Format ("{0}> @ 0", searchField), nuevo DateTime (2001, 1, 15)); funcionó muy bien –

+0

Impresionante, gracias! –

1

¿Qué pasaría si todo el lambda se crea de forma dinámica (vamos a ir con igual vez de mayor que) y el tipo no se conoce? En ese caso, no puede usar DateTime.Parse en los parámetros where. Si intenta pasar el objeto DateTime, Dynamic LINQ lo interpreta como un tipo int32. ¿Podría hacerlo convirtiendo los ticks o milisegundos de DateTime primero y comparando eso?

3

que utilizan Convert.ToDateTime para resolver el problema, como lo estoy haciendo algo similar a Kappasims

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

que he visto este consejo en torno a un montón, pero no funciona para mí - falla con 'LINQ a Entidades no reconoce el método 'System.DateTime ToDateTime (System.String)'' –

+0

Tengo mismo problema con ese consejo. ¿En qué servidor SQL está funcionando? –

3

Si usted quiere hacer esto con sólo el formato Where([string]), que no pasa en otros parametros, puede utilizar el formato de fecha Date(yyyy, mm, dd). Así que yo era capaz de conseguir este trabajo haciendo

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

Hay una especificación completa here que describe el análisis y usos válidos.

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