2009-08-20 6 views
1

Ich kann das nicht ganz herausfinden. Ich habe eine Tabelle namens Mitarbeiter mit und Id-Feld. Die Tabelle enthält auch ein ManagerId-Feld mit einem Fremdschlüssel, der auf das ID-Feld des Mitarbeiters verweist. Wenn ich die Tabelle als Entität zu meinem Entitätsdatenmodell hinzufüge, erstellt sie die neue Employee-Entität mit einem EmployeeChildren-Auflistungselement und einem EmployeeParent-Element. Ich kann alle Angestellten abrufen und sie in eine neue Instanz der Entität Employee einfügen lassen. Die Entität der Angestellten hat viele Kinder, jede untergeordnete Entität kann viele eigene Kinder haben und jede hat einen Zeiger zurück auf ihre Eltern.Linq zu Entities - Entity mit "Selbstreferenz" von Stored Procedure abrufen

Was ich jetzt tun muss, ist eine Teilmenge dieser Mitarbeiter abrufen eine gespeicherte Prozedur verwenden. Wenn ich jetzt nach Mitarbeiter John Doe suche, der 2 Personen über ihm hat, gibt die gespeicherte Prozedur 3 Zeilen zurück.

EmployeeID MANAGERID Namen

1 null Bill

2 1 Jane

3 2 John Doe

Hier ist mein Code den Abruf zu tun:

using (var entity = new TimeEntryEntities()) 
    { 

     var employees = 
       from E in entity.EmployeeSearch(search) 
       orderby E.Name 
       select E; 


     return employees.ToList<Employee>(); 
    } 

Rechts Jetzt gibt dieser Code 3 separate Entitäten zurück. Wie kann ich sie zu einem zusammenfassen lassen?

+0

Funktioniert das wie erwartet, wenn Sie die gespeicherte Prozedur nicht verwenden? Wenn Sie einen einzelnen Mitarbeiter direkt mit einer LINQ-Abfrage abrufen, werden die Sammlungen "Manager" und "Berichte" so ausgefüllt, wie sie sein sollten? –

+0

Es funktioniert, aber es kommt nicht so zurück, wie ich es brauche. Es ruft den Mitarbeiter ab und diese Entität erhält eine übergeordnete Entität. Die übergeordnete Entität hat einen Elternteil und das Kind ... und so weiter. Ich brauche es, um beim obersten Elternteil zu beginnen, nicht beim untergeordneten Kind. Ich hoffe das ergibt Sinn. –

Antwort

0

Es klingt wie Sie versuchen, die Hierarchie zu glätten, so dass nur ein Datensatz zurückgegeben wird. Vielleicht kann Common Table Expression (CTE) in der gespeicherten Prozedur helfen: Here is an alternate of a similar request:

Auch another example with more detail (aber Sie haben kostenlos registrieren.):

+0

Ich verwende ein CTE in der Prozedur, um die 3 Zeilen zurückzugeben. Es findet die untergeordnete Zeile, die dann ein CTE verwendet, gibt das übergeordnete Element zurück, dann das übergeordnete Element des übergeordneten Elements usw. Dies führt dazu, dass 3 Zeilen von der Datenbank zurückgegeben werden. Jetzt muss ich diese Zeilen in meine Employee-Entität einfügen. Ich frage mich, ob ich das manuell tun muss und in diesem Fall linq to entity vergessen muss. –

-1

Sie sollten nur die Entität zurückgeben Sie interessiert sind EF ruft die zugehörigen Entitäten automatisch für Sie ab. Dies wäre einfacher zu visualisieren, wenn Sie nicht eine Selbstreferenz verwenden, dieses Konzept hat sich in die Quere kommen.