2012-04-10 12 views
6

que tienen una consulta LINQ que devuelve a un tipo var myQryfechas en consulta utilizando LINQ

var myQry = from ..... 

Ésta es una gran LINQ devuelve todos los registros que necesito para filtrar aún más. En una de mis condiciones if, tengo un filtro que funciona así para verificar la fecha. Necesito verificar si el nombre contiene el nombre ingresado y coincide exactamente con la fecha de nacimiento.

yo probamos este, que compila y se corrió, pero no funcionó correctamente

myQry.Where(x => x.FirstName.Contains(strName) && DateTime.Compare(x.BirthDt, searchDt)>=0).ToList() 

Luego probé esto lo que dio inició una excepción "argumentos DbArithmeticExpression deben tener un tipo común numérico"

myQry.Where(x => x.FirstName.Contains(strName) && (x.BirthDt- searchDt).Days == 0).ToList(); 

Para ese tipo de situaciones cuando uso una cláusula where en mi consulta, ¿cuál sería la mejor manera de hacer una comparación de fechas? ¿Qué tipo de operaciones no están permitidas en la cláusula where de una consulta LinQ?

Gracias por su tiempo ...

+0

¿Cuál es el tipo de 'x.BirthDt'? ¿Cuál es el tipo de 'searchDt'? Aparentemente no son ambos 'DateTime'. – Servy

+0

¿Y estás en linq2sql o linq2entities? –

+1

Ambos son fechados. Estoy en linq2sql – user20358

Respuesta

3

En este caso, es posible que desee utilizar funciones específicas de SQL Server utilizando métodos de la clase SqlMethods.

Su segunda consulta podría ser reescrita como

myQry.Where(x => x.FirstName.Contains(strName) && 
    SqlMethods.DateDiffDay(x.BirthDt, searchDt) == 0).ToList() 

que será traducido a algo así como

SELECT ... FROM Table WHERE FirstName 
    LIKE '@p0' AND DATEDIFF(Day, BirthDt, @p1) = @p2 

donde p0, p1 y p2 son parámetros.

3

Prueba esto:

myQry.Where(x => x.FirstName.Contains(strName) && 
x.BirthDt.Date == searchDt.Date).ToList() 

Tenga en cuenta que para el anterior para trabajar, tanto BirthDt y searchDt deben ser valores DateTime válido. Ahora está comparando solo la parte Fecha de los valores DateTime descartando la parte Time.

1

Qué operaciones son compatibles depende de la estructura ORM, (Nhibernate, EF, etc.), pero básicamente se puede considerar que si el método que está utilizando no tiene una traducción literal a SQL es muy probable que no lo haga ser apoyado

Es por eso que se apoya el operador == pero no DateTime.Compare método, o el operador - en DateTime no es compatible, ya que no tiene una traducción clara.

Siempre trate de apegarse al operador más simple y evite los métodos, si eso no funciona tendrá que buscar en Google si su método ORM admite ese método específico.

1

Estoy de acuerdo con Leniel Macaferi con respecto a la actualización de la cláusula Where y comparando fechas en lugar de fechas y horas. Para una fecha de nacimiento, generalmente el momento del nacimiento no es relevante. Para responder a su segunda pregunta

¿Qué tipo de operaciones no están permitidas en la cláusula where de una consulta LinQ ?

Where() es un método de extensión que funciona en IEnumerable<T> o IQueryable<T>. Podemos ver esto pulsando F12 en Where para echar un vistazo al código fuente:

public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate); 

Las operaciones apoyadas son conocidos como predicados. Un predicado es un delegado que toma un argumento de tipo TSource y devuelve un bool que nos dice si la condición coincide o no. Esto se puede ver en el código anterior en el segundo parámetro: Func<TSource, bool> predicate

Puede definir el predicado para que sea lo que desee.Siempre que devuelva un bool y acepte 1 parámetro de tipo TSource.

Esto se logra generalmente al definir una expresión lambda, que es lo que Leniel Macaferi hizo por usted.