2011-02-09 42 views
6

estoy utilizando LINQ a Entidades para recuperar fechas de compra de artículos de la siguiente manera:Usando DateTime en la dinámica de LINQ a Entidades

where EntityFunctions.TruncateTime(order.PurchaseDate) == myPurchaseDate.date 

La clave aquí es que la columna de la base de datos contiene la fecha y la hora así que el tiempo debe ser despojado para la comparación Este código funciona bien.

Ahora, quiero hacer lo mismo usando LINQ dinámico para Entidades. Estoy usando dynamic.cs de la carpeta de ejemplos de código VS2010. Cuando codigo:

.where("EntityFunctions.TruncateTime(PurchaseDate) == @0", myPurchaseDate.date); 

o cualquier variante del mismo recibo un mensaje de error. ¿Qué debo codificar como valor de cadena para que esto funcione? (Como puedo usar .StartsWith o .Contains dentro de la cadena, espero que exista alguna función de fecha dinámica que LINQ reconozca).

sé que puedo crear la consulta LINQ dinámica para ser un intervalo de fechas, conceptualmente:

PurchaseDate >= [email protected] and PurchaseDate <= myPurchaseDate+23:59:59 

De hecho, tal vez un intervalo de fechas es más eficiente desde el punto de vista de SQL Server, pero me gustaría saber si algo como TruncateTime o ToShortDate existe dentro de Dynamic LINQ to Entities.

+0

¿Qué versión de Entity Framework está utilizando? –

Respuesta

0

Creo que va a querer ir con el rango de fechas para que pueda aprovechar la indexación en el servidor si es necesario. Si basa su declaración de selección en un campo calculado, necesitará escanear la tabla para cada consulta.

+0

Gracias por confirmar mi corazonada. Si bien no hice ningún análisis de plan de consulta, esto tiene sentido para mí. – user610342

0

Aquí hay un enlace que enumera las funciones EF4 que se asignan a las funciones SQL

Conceptual Model Canonical to SQL Server Functions Mapping

+0

Gracias. He visto esa lista. Sin embargo, no se aplica a las consultas dinámicas de LINQ a Entidades. Francamente, no estoy seguro de que se aplique a Linq to Entities ya que siempre he tenido que usar la lista canónica de EntityFunctions (que es diferente). – user610342

2

Si sus consultas a menudo búsqueda tanto el aspecto fecha, otro enfoque para considerar, si está disponible, con su base de datos de SQL Server , sería almacenar de manera redundante una versión truncada de la columna de fecha y hora, en un tipo de columna de fecha. Ver http://msdn.microsoft.com/en-us/library/bb630352.aspx).

Todas sus consultas pueden tener un mejor rendimiento porque no son necesarias conversiones, son menos propensas a errores del desarrollador. Y también son más fáciles de consultar en SQL simple.

Sus consultas EF serían entonces se le pregunta sobre columna de fecha de SQL Server

+0

Actualmente estamos comenzando el diseño de la nueva base de datos y esto es algo que planeo plantear con el arquitecto de la base de datos. – user610342

11

recientemente he empezado a utilizar LINQ dinámica para un proyecto y también quería comparar fechas sin el componente de tiempo. El código de muestra dinámico de linq C# de Microsoft (Dynamic.cs) admite un conjunto fijo de tipos, y EntityFunctions no es uno de ellos.

Pero con un poco de experimentación, encontré que sólo añadir EntityFunctions al conjunto de tipos predefinidos permite el uso de TruncateTime y probablemente otros EntityFunctions métodos también.

Esto es lo que la matriz Dynamic.cs predefinedTypes se ve como en mi proyecto:

static readonly Type[] predefinedTypes = { 
    typeof(Object), 
    typeof(Boolean), 
    typeof(Char), 
    typeof(String), 
    typeof(SByte), 
    typeof(Byte), 
    typeof(Int16), 
    typeof(UInt16), 
    typeof(Int32), 
    typeof(UInt32), 
    typeof(Int64), 
    typeof(UInt64), 
    typeof(Single), 
    typeof(Double), 
    typeof(Decimal), 
    typeof(DateTime), 
    typeof(TimeSpan), 
    typeof(Guid), 
    typeof(Math), 
    typeof(Convert), 
    typeof(System.Data.Objects.EntityFunctions)    // JimM 
}; 

Con este archivo Dynamic.cs modificado, soy capaz de crear consultas LINQ dinámicos incluyendo expresiones como el ejemplo purchaseDate en su pregunta.

+0

Excelente solución. ¡Gracias! – user610342

+0

Acuerdo solución muy clara, muy útil. –

Cuestiones relacionadas