En ocasiones para optimizar consultas con datos calculados parciales, tenemos la opción de reutilizarlos mediante sub-expresiones en una sola iteración. En este ejemplo reutilizamos un cálculo (sencillo para el ejemplo), en lugar de realizar el sumatorio o la llamada a una función para cualquier cálculo…
Leer máslinq
TIP: Hashtable to Object
Si bien existen librerias completas para asignar propiedades entre objetos, también es posible asignar de manera automática nuevos valores en pocas líneas de forma recursiva. En este caso se trata de asignar nuevos valores editados en un objeto que, por ejemplo, podremos utilizar para guardar los cambios dentro de Entity Framework. Un escenario común en un Grid:
using System.Data;
using System.Linq;
using System.Reflection;
...
Hashtable nuevosValores;
...
long idBuscado = long.Parse(nuevosValores["id"].ToString());
Coches n = miEntidad.Coches.Where(x => x.id == idBuscado).FirstOrDefault();
foreach (PropertyInfo p in n.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public))
{
// Puede tener propiedades el objecto de la entidad que no se utilizan
// por ejemplo la relación con otra tabla tambien aparece listada
if (nuevosValores.ContainsKey(p.Name))
p.SetValue(n, nuevosValores[p.Name]);
}
miEntidad.SaveChanges();
Un ejemplo sencillo del uso de la reflexión en los objectos.
Funciones personalizadas en expresiones LINQ
En las últimas versiones de Entity Framework ciertos métodos que antes si eran aceptados, como también se podía realizar en SQL, han dejado de estar disponibles. Aquellas funciones heredadas directamente de SQL han quedado englobadas en la misma clase. Algo que antes era habitual pero no precisamente una buena forma de solucionar… las conversiones de tipos de datos, ¿quien no ha convertido un string en entero en SQL?
LINQ to Entities does not recognize the method 'XXXXXXX' method, and this method cannot be translated into a store expression
TIP: Linq could not find an implementation of the query pattern
En modelos de datos generados con LINQ de forma automática, el acceso separado en diferentes clases puede ocasionar errores del tipo:
CS1936 Could not find an implementation of the query pattern for source type 'DbSet<nombreTabla>'. 'Where' not found.
A priori puede parecer un error en la implementación, alguna modificación de clases incorrecta, siempre esta la posibilidad de volver a generar el modelo de datos, si el error persiste debemos comprar que tenemos referenciada el espacio de nombres de LINQ
using System.Linq;
Una error tan sencillo y obvio que puede resultar confuso de resolver.
TIP: debug Linq SQL
En ocasiones podemos encontrar sentencias complejas o sin errores aparentes, otra forma de intentar buscar soluciones es mostrar la sentencial SQL generada por Entity Framework. Tan solo debemos habilitar el log, mostrandolo en en panel Output de nuestro Visual Studio por ejemplo:
using (ModeloEntities entidad = new ModeloEntities ()) { entidad.Database.Log = s => System.Diagnostics.Debug.WriteLine(s); var resultado = (nuestraConsultaLINQ) }
NOTA: puedes recupera la ventana de salida con CTRL + ALT + O