2017-12-28 15 views
2

Ich habe eine Tabelle mit dem Namen dbo.EmployeeType mit drei Datensätze:Linq-Code nicht zurück korrekte Datensatz

PK_EmployeetypeID EmployeeTypeName 
1     Project Manager 
2     Business Analyst 
3     Developer 

Ich habe dieses Stück Linq-Code:

public static string GetTypeByID(int id) 
{ 
    using (ProjectTrackingEntities1 db = new ProjectTrackingEntities1()) 
    { 
     var type = db.EmployeeTypes.Select(o => new LOOKUPEmployeeType 
     { 
      PK_EmployeeTypeID = id, 
      EmployeeTypeName = o.EmployeeTypeName 
     }); 

     return type.FirstOrDefault().EmployeeTypeName; 
    } 
} 

Egal, welche id ich sende es gibt zurück, und ich bin verwirrt, warum.

+0

Setzen Sie einen Haltepunkt auf 'type = ...' und inspizieren Sie es. Sie haben keine WHERE drin, also bekommen Sie alle - und Select macht aus allen LOOKUPMitarbeiterTypen. FirstOrDefault gibt den ersten zurück, der immer der ProjManager ist. –

+0

Code gibt immer den Wert "first" zurück (welcher DB in keiner bestimmten Reihenfolge als "erster" betrachtet wird) record ... Können Sie bitte klarstellen, was Sie von diesem Code erwarten? (oder jemand, der den Posten hochgestuft hat, könnte dasselbe getan haben). –

Antwort

7

Sie müssen einen Filter anwenden, sonst geben Sie nur den ersten Datensatz zurück und codieren die ID hart. Versuchen Sie folgendes:

public static string GetTypeByID(int id) 
{ 
    using (ProjectTrackingEntities1 db = new ProjectTrackingEntities1()) 
    { 
     //Here we apply a filter, the lambda here is what creates the WHERE clause 
     var type = db.EmployeeTypes 
      .FirstOrDefault(et => et.PK_EmployeeTypeID == id); 

     if(type != null) 
     { 
      return type.EmployeeTypeName; 
     } 
     else 
     { 
      return ""; 
     } 
    } 
} 

Beachten Sie, dass FirstOrDefault unter Verwendung von Mitteln, wenn es keine Übereinstimmungen gibt, oder mehrere Übereinstimmungen, wird type sein null und Sie werden eine leere Zeichenfolge zurückgegeben.

+0

Ahh, das macht Sinn und ist viel sauberer als das, was ich versucht habe – DForck42

+0

Vielleicht möchten Sie etwas anderes als eine leere Zeichenfolge zurückgeben, wenn kein Datensatz gefunden wird. – DavidG

+0

yeah, es ist ein Pflichtfeld in der Datenbank, also sollte dieses Stück in der Theorie nie – DForck42

2

Einen Haltepunkt auf type = ... setzen und prüfen. Sie haben keine Where drin, so dass Sie alle bekommen - und Select macht nur LOOKUPEmployeeTypes aus allen von ihnen.

FirstOrDefault kehrt dann die erste dieser drei, die immer die ProjManager ist

Fix:

var type = db 
    .EmployeeTypes 
    .Where(o => o.Id == id) 
    .Select(o => new LOOKUPEmployeeType 
{ 
    PK_EmployeeTypeID = id, 
    EmployeeTypeName = o.EmployeeTypeName 
}); 
0

In Ihrem Code, den Sie nur den ersten Wert zurück. Sie müssen EF mitteilen, welchen Wert Sie zurückgeben müssen.

Angenommen, Sie benötigen den Wert mit Id = 2. Verwenden Sie anstelle von Select()Single(x => x.Id == 2) oder First(x => x.Id == 2).

Verwandte Themen