Estamos usando EF4 en un sistema bastante grande y ocasionalmente enfrentamos problemas debido a que EF4 no puede convertir ciertas expresiones en SQL. En este momento, debemos hacer algún trabajo de pies (DB/Code) o simplemente aceptar el golpe de rendimiento y permitir que la consulta se ejecute en la memoria.Extendiendo EF4 SQL Generation
Huelga decir que ninguno de estos es ideal y los hacks que a veces hemos tenido que usar reducen la legibilidad/mantenibilidad.
Lo que idealmente nos gustaría es una forma de ampliar las capacidades de generación de SQL del proveedor de EF4 SQL. Obviamente, hay algunas cosas, como las llamadas al método .Net, que siempre tendrán que ser del lado del cliente, pero algunas funcionalidades, como las comparaciones de fechas (por ejemplo, [Agrupar por semanas en Linq a Entities) deberían poderse hacer.
He buscado en Google pero quizás estoy usando una terminología incorrecta, ya que todo lo que obtengo es información sobre las nuevas características de EF4 SQL Generation.
Para un marco tan flexible y extensible, me sorprendería que esto no fuera posible. En mi cabeza, me imagino heredar del proveedor [SQL 2008] y extenderlo para manejar expresiones adicionales/similares en el árbol de expresiones que se le da para convertir a SQL.
Cualquier ayuda/sugerencias apreciadas.
Estamos utilizando VS2010 Ultimate, .Net 4 (perfil no cliente) y EF4. La aplicación se encuentra en ASP.Net y se ejecuta en un entorno de 64 bits en caso de que haga la diferencia.
Actualización: En respuesta a algunas solicitudes de aclaración;
Estamos utilizando un enfoque de primer código y tenemos una aplicación de consola que crea la base de datos y rellena algunas tablas de referencia.
Preferiría mantenerme alejado de los procesos almacenados a menos que también puedan generarse de una manera similar: en la actualidad, se generan nuevas versiones de la base de datos según sea necesario y un proceso separado migra/sincroniza datos. todo que actualmente hacemos con respecto a la base de datos usa entidades. Admito que no puedo dar una buena razón, pero ejecutar scripts SQL para generar procs almacenados parece estar mal en este escenario. Pero corrígeme si me equivoco.
Con respecto a un escenario específico, me temo que no puedo dar uno de nuestro código sin pasar por un largo ejercicio de burocracia - El link mentioned above es un buen ejemplo del tipo de cosas que estamos tratando de realizar. En este ejemplo, la implementación de un mecanismo que permita la aritmética de fechas:
DateTime firstDay = GetFirstDayOfFirstWeekOfYear();
var userTimes = from t in context.TrackedTimes
group t by new {t.User.UserName, WeekNumber = (t.TargetDate - firstDay).Days/7} into ut
select new
{
UserName = ut.Key.UserName,
WeekNumber = ut.Key.WeekNumber,
Minutes = ut.Sum(t => t.Minutes)
};
puedo ver una manera que esto podría lograrse mediante SQL solos pero no cómo hacerlo usando LINQ a Entidades (del lado del servidor).
Es difícil responder a una pregunta tan abstracta. ¿Qué estás tratando de apoyar exactamente? Hay * muchas * formas de hacer esto (EdmFunctions, almacenar consultas, ejecutar SQL literal, etc.). –
Es cierto: he ampliado la pregunta para incluir un ejemplo. Espero que esto esté más claro? – Basic