2012-09-18 12 views
7

Sé que cambiar la forma de una consulta hace que Entity Framework ignore las llamadas de inclusión, pero ¿hay alguna forma de que pueda cargar las sub propiedades cuando selecciono un número y un grupo de. En el siguiente ejemplo, deseo notificar a todos los empleados que tienen un trabajo reservado en un período de tiempo determinado. Llamar a .ToArray() después de donde solo golpea la base de datos una vez, pero estoy haciendo SelectMany y GroupBy en la memoria. ¿Hay alguna manera de que pueda obtener SelectMany y GroupBy en el servidor SQL y aún así incluir el ServiceType y Ship and the Employee?Obtención de Entity Framework para una carga ansiosa en Group Por

Estoy buscando una forma de hacer una llamada SQL a la base de datos y terminar con una lista de los empleados que tienen un trabajo en el período de tiempo y los trabajos a los que están asignados.

var employeeJobs = DataContext.Jobs. 
    Include("ServiceType"). 
    Include("Ship"). 
    Include("JobEmployees.Employee"). 
    Where(j => j.Start >= now && j.Start <= finish). 
    OrderBy(j => j.Start). 
    ToArray(). 
    SelectMany(j => j.JobEmployees, (j, je) => new { 
     Job = j, 
     Employee = je.Employee 
    }).GroupBy(j => j.Employee); 
+0

_I estoy haciendo la SelectMany y GroupBy en memory_. ¿Cómo lo sabes? La forma de la consulta en EF puede ser esquiva. –

+0

Si quiere terminar con una lista de empleados y sus trabajos, le sugiero que haga la consulta al revés: employeeJobs = de DataContext.Employees e donde e.Any (... tiene criterios de trabajo ...) seleccione e. No soy capaz de escribir la consulta LINQ sin ayuda de intellisense, pero ¿entiendes? – GTG

+1

@GertArnold La llamada a 'ToArray' materializa los resultados,' SelectMany' y 'GroupBy' vienen * después de * la llamada a' ToArray'. – casperOne

Respuesta

0

¿por qué no creas una vista y luego haces referencia a esto desde el EF? , esto también tiene el beneficio adicional del servidor de base de datos que hace el trabajo, en lugar del servidor de la aplicación.

+0

El punto de EF es que el el trabajo ** se está haciendo ** en el servidor de la base de datos. Por lo tanto, tu respuesta no tiene sentido. –

-1

Intentando mover los Include() hasta el final después de tu groupby.

+0

Incluir se define en ObjectQuery y no para IQueryable, que es el tipo de devolución de GroupBy. No creas que esto funciona :( –

1

El siguiente debería funcionar:

var q = from e in DataContext.Employees 
    where e.Job.Start > .... 
    order by e.Job.Start 
    select new {Employee = e, Job = e.Job, Ship = e.Job.Ship, ServiceType = e.Job.ServiceType}; // No db hit yet. 

var l = q.GroupBy(item=>item.Employee) // no db hit yet. 
    .ToList(); // This one causes a db hit. 
Cuestiones relacionadas