related query objects not method lazy framework c# generics entity-framework-6 associations

c# - query - linq include



El predicado Lambda de Entity Framework almacenado en var con asociaciĆ³n (2)

Tengo un repositorio genérico usando EF6. El problema tiene que ver con las propiedades de asociación que requieren un "Incluir" aunque no debería. Los siguientes trabajos:

IQueryable<User> dbQuery = _db.Set<User>(); return dbQuery.Where(x => x.Child.Name == "Foo").ToList();

Sin embargo, lo siguiente no funciona:

Func<User, bool> filter = x => x.Child.Name == "Foo"; IQueryable<User> dbQuery = _db.Set<User>(); return dbQuery.Where(filter).ToList();

Lanza una excepción de "Referencia de objeto no establecida ..." en el elemento secundario.

Lo siguiente lo resuelve:

Func<User, bool> filter = x => x.Child.Name == "Foo"; IQueryable<User> dbQuery = _db.Set<User>(); dbQuery = dbQuery.Include(x => x.Child); return dbQuery.Where(filter).ToList();

No entiendo por qué esto es necesario sin embargo. ¿Alguien sabe una manera de resolver esto sin usar el "Incluir"?


Debes usar Expression para que el proveedor de EF analice tu consulta.

Cambie el Func<User, bool> a Expression<Func<User, bool>>


El primer fragmento proporciona una Expression a Where , que se está traduciendo a SQL, y está haciendo toda la operación en la base de datos. Los dos últimos están pasando un método compilado a Where , que no puede traducir a SQL, lo que significa que toda la tabla de la base de datos se está reduciendo a la memoria, y toda la operación se ejecuta en la aplicación. Cuando tira hacia abajo la tabla completa, no baja los registros relacionados a menos que los Include .

La solución no es desplegar tanto la tabla completa como todos los datos de todos los registros relacionados; la solución es filtrar en la base de datos en lugar de hacerlo en su aplicación.