2012-09-18 12 views
7

Wiem, że zmiana kształtu zapytania powoduje, że Entity Framework ignoruje wywołania włączone, ale czy istnieje sposób, w jaki można go pobrać, aby załadować właściwości podrzędne, gdy wybiorę wiele i grupa wg. W poniższym przykładzie chcę powiadomić wszystkich pracowników, którzy mają pracę zarezerwowaną w określonym czasie. Wywoływanie .ToArray() po miejscu, w którym tylko raz trafia do bazy danych, ale robię SelectMany i GroupBy w pamięci. Czy istnieje sposób, aby uzyskać SelectMany i GroupBy na serwerze SQL i nadal zawierać ServiceType i Ship i szczegóły pracownika?Uzyskiwanie struktury Entity do pełnego obciążenia dla grup przez

Szukam sposobu, aby wykonać jedno połączenie SQL z bazą danych, a kończy się lista pracowników, którzy mają pracę w okresie czasu i zadań, do których są przypisani.

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 robie z SelectMany i GroupBy w memory_. Skąd wiesz? Kształt zapytania w EF może być nieuchwytny. –

+0

Jeśli chcesz skończyć z listą pracowników i ich pracy, sugeruję wykonanie zapytania odwrotnie: employeeJobs = from DataContext.Employees e where e.Any (... ma kryteria pracy ...) wybierz e. Nie jestem w stanie napisać zapytania LINQ dla ciebie bez jakiejś pomocy intellisense, ale masz pomysł? – GTG

+1

@GertArnold Wywołanie 'ToArray' materializuje wyniki,' SelectMany' i 'GroupBy' przychodzą * po * wywołaniu' ToArray'. – casperOne

Odpowiedz

0

dlaczego nie stworzysz widoku, a następnie odniesiesz go do EF? , ma to również dodatkową zaletę, że serwer bazy danych wykonuje pracę, a nie serwer aplikacji.

+0

Istotą jest to, że EF praca ** ** jest wykonywana na serwerze bazy danych. Tak więc twoja odpowiedź nie ma sensu. –

-1

Próba przeniesienia funkcji Include() do końca po przejściu do grupy.

+0

Include jest zdefiniowany w ObjectQuery, a nie w IQueryable, który jest typem zwracanym GroupBy. Nie myśl, że to działa :( –

1

Poniższa powinno działać:

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. 
Powiązane problemy