2012-09-18 6 views
7

Ich weiß, dass die Änderung der Form einer Abfrage Entity Framework die Include-Aufrufe ignoriert, aber gibt es eine Möglichkeit, ich kann es die Sub-Eigenschaften laden, wenn ich eine Auswahl viele und eine Gruppe von. Im folgenden Beispiel möchte ich alle Mitarbeiter benachrichtigen, die einen Job in einem bestimmten Zeitraum gebucht haben. Aufruf von. ToArray() nach dem wo nur einmal die Datenbank trifft, aber ich mache die SelectMany und GroupBy im Speicher. Gibt es eine Möglichkeit, dass ich SelectMany und GroupBy auf dem SQL-Server ausführen kann und trotzdem die Details zu ServiceType, Ship und Employee enthält?Getting Entity Framework auf eifrige Belastung von Group Von

Ich bin auf der Suche nach einer Möglichkeit, einen SQL-Aufruf an die Datenbank und am Ende mit einer Liste von Mitarbeitern, die einen Job in dem Zeitraum haben und die Aufträge, denen sie zugeordnet sind.

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 tue die Select und GroupBy in memory_. Woher weißt du das? Die Form der Abfrage in EF kann schwer fassbar sein. –

+0

Wenn Sie mit einer Liste von Mitarbeitern und deren Jobs enden möchten, würde ich vorschlagen, die Abfrage andersherum durchzuführen: employeeJobs = von DataContext.Employees e, wo e.Any (... hat Job-Kriterien ...) Wählen Sie e. Ich bin nicht in der Lage, die LINQ-Abfrage ohne Intellisense-Hilfe für Sie zu schreiben, aber Sie bekommen die Idee? – GTG

+1

@GertArnold Der Aufruf von 'ToArray' materialisiert die Ergebnisse, die' SelectMany' und 'GroupBy' kommen * nach * dem Aufruf von' ToArray'. – casperOne

Antwort

0

Warum erstellen Sie keine Ansicht und verweisen Sie dann auf die EF? , hat dies auch den zusätzlichen Vorteil, dass der Datenbankserver die Arbeit erledigt, und nicht der App-Server.

+0

Der ganze Sinn von EF ist, dass die Arbeit ** wird ** auf dem Datenbankserver durchgeführt. Deine Antwort ergibt also keinen Sinn. –

-1

Versuchen Sie, die Include() bis zum Ende nach Ihrer groupby zu verschieben.

+0

Include ist in ObjectQuery definiert und nicht in IQueryable, das den Rückgabetyp von GroupBy darstellt. Glaube nicht, dass das funktioniert :( –

1

Folgendes sollte funktionieren:

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. 
Verwandte Themen