2017-07-08 2 views
0

Ich versuche, eine Liste von Objekten zu filtern, die aus der Datenbank abgerufen wurden, gemäß den aus dem REST-URI abgerufenen Parametern. Beispiel-URI wäre , die mir eine Liste von Objekten mit angegebenen Vornamen und Nachnamen abrufen würde.REST-URI-Parameter zum Filtern der Antwort

Der Fehler, den ich bekommen habe, während eine solche URI schlagen ist die folgende:

<ExceptionMessage> 
Object reference not set to an instance of an object 
</ExceptionMessage> 
<ExceptionType>System.NullReferenceException</ExceptionType> 

MyWebService.Controllers.EmployeeApiController+<>c__DisplayClass4_0.<ListEmployees>b__0 (MyWebService.Models.Employee x) [0x00000] in <8bf6371a770245f989f67352a05d8bb6>:0 at System.Linq.Enumerable+WhereListIterator`1[TSource].MoveNext() [0x00037] in /private/tmp/source-mono-2017-02/bockbuild-2017-02/profiles/mono-mac-xamarin/build-root/mono-x86/external/corefx/src/System.Linq/src/System/Linq/Where.cs:369 at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeList 

Das gleiche geschieht für das heißt. URI http://127.0.0.1:8080/api/employee?id=3, während es wie erwartet für URI http://127.0.0.1:8080/api/employee/3 funktioniert. Es funktioniert auch wie erwartet (ruft alle Objekte aus der Datenbank ab) für URI http://127.0.0.1:8080/api/employee/.

Das einzige, was nicht funktioniert, sind die Parameter. Hier ist der Code.

Controller.cs

[RoutePrefix("api/employee")] 
    public class EmployeeApiController : ApiController 
    { 

     readonly EmployeePersistence persistence; 


     public EmployeeApiController() 
     { 
      persistence = new EmployeePersistence(); 
     } 

     [HttpGet] 
     [Route("{id:long}")] 
     public IHttpActionResult GetEmployee(long id) 
     { 
      return Json(persistence.GetEmployee(id)); 
     } 

     [HttpGet] 
     [Route("")] 
     public IHttpActionResult ListEmployees([FromUri] EmployeeParameters parameters) 
     { 
      return Json(persistence.GetEmployeeList().Where(x => x.FirstName.Equals(parameters.FirstName))); 
     } 
    } 
} 

EmployeeParametes.cs

public class EmployeeParameters 
{ 
    /** 
    * First name of the employee. 
    */ 
    public string FirstName { get; set; } 

    /* 
    * Last name of the employee. 
    */ 
    public string LastName { get; set; } 

    /** 
    * Place of birth of the employee. 
    */ 
    public string BirthPlace { get; set; } 

    /** 
    * Gender of the employee. 
    */ 
    public int Gender { get; set; } 

    /** 
    * OIB of the employee. 
    */ 
    public string OIB { get; set; } 


    /** 
    * Current place of the employee. 
    */ 
    public string CurrentPlace { get; set; } 


    /** 
    * Department code of the employee. 
    */ 
    public string Department { get; set; } 

    public EmployeeParameters() 
    { 
    } 
} 

Persistence.cs

public List<Employee> GetEmployeeList() 
     { 
      string sqlString = "SELECT * FROM Employee"; 

      MySqlCommand cmd = new MySqlCommand(sqlString, conn); 

      List<Employee> employees = new List<Employee>(); 

      using (MySqlDataReader reader = cmd.ExecuteReader()) 
      { 
       while (reader.Read()) 
       { 
        employees.Add(ReadFromDatabase(reader)); 
       } 
      } 

      return employees; 
     } 

Employee ReadFromDatabase(MySqlDataReader dataReader) 
     { 
      if (!dataReader.Read()) 
      { 
       return null; 
      } 

      string firstName = null; 
      string lastName = null; 
      string birthPlace = null; 
      string currentPlace = null; 
      int gender = -1; 
      string departmentCode = null; 
      string OIB = null; 

      try 
      { 
       firstName = dataReader.GetString(1); 
       lastName = dataReader.GetString(2); 
       birthPlace = dataReader.GetString(3); 
       currentPlace = dataReader.GetString(4); 
       gender = dataReader.GetInt32(5); 
       departmentCode = dataReader.GetString(6); 
       OIB = dataReader.GetString(7); 
      } 
      catch (SqlNullValueException) 
      { 
       // log the error 
      } 

      return new Employee(
       firstName != null ? firstName : "N/A", 
       lastName != null ? lastName : "N/A", 
       birthPlace != null ? birthPlace : "N/A", 
       currentPlace != null ? currentPlace : "N/A", 
       gender != -1 ? (gender == 1 ? EmployeeGender.M : EmployeeGender.F) : 
        EmployeeGender.UNDEFINED, 
       departmentCode != null ? 
        DepartmentCodeExtensions.GetEnumValue(DepartmentCode.NONE, departmentCode) : 
        DepartmentCode.NONE, 
       OIB != null ? OIB : "N/A" 
      ); 
     } 

Ich bin Ich vermute, dass das Problem etwas mit den Routen ist, aber nicht genau, was oder wie es zu beheben ist. Jede Hilfe wird geschätzt.

+0

Geben Sie die vollständige Stack-Ablaufverfolgung der Ausnahme zusammen mit dem vollständigen Inhalt der drei CS-Dateien an. Andernfalls ist es schwer zu sagen, wo der Fehler liegt. –

+0

@ J.N. Wie gewünscht aktualisiert. – wesleyy

+0

Haben Sie den Debugger durchlaufen und überprüft, dass es das Parameter-Objekt ist, das null ist, und nicht die von der Persistence-Klasse zurückgegebene Sammlung "Employees"? – Eris

Antwort

0

Ich denke, dass die Ausnahme auftritt, weil die Aufrufe an .Read() in der while -loop und innerhalb der Methode ReadFromDatabase. Sie sollten den Anruf .Read() von letzterem löschen.

Wie Ihr Code jetzt ist, werden zwei Anrufe von .Read() im Leser durchgeführt, bevor Sie Daten aus dem Leser extrahieren. Ein weiteres Problem ist, dass Sie null in Ihre Liste der Mitarbeiter setzen, wenn der Leser nicht mehr lesen kann, was eine NullPointerException garantiert, wenn Sie versuchen, die Eigenschaft dieses Elements zu verwenden.

Verwandte Themen