2017-02-24 8 views
0

ich diesen Fehler,Nur parameterlose Konstruktoren und Initialisierer für Entitäten?

Nur parameterlos Konstrukteuren und initializers werden in LINQ to Entities unterstützt.

Bei der Untersuchung scheint dies ein häufiges Problem mit vielen Antworten. Außer, dass ich viele Antworten nicht zurückentwickeln kann, um das selbst zu lösen.

Ich weiß, die Antwort ist in dem Fehler, aber ich kann nicht sehen, was parameterlose Konstruktoren verwenden müssen? Oder in diesem Beispiel weiß ich nicht einmal, wo der Parameter gerade ist.

Diese LINQ-Abfrage gibt mir Mühe:

public static ObservableCollection<Employee> ReturnEmployeesInSection(string section) 
{ 
    using (StaffShiftManagerEntities dataBaseEntities = new StaffShiftManagerEntities()) 
    { 
      return new ObservableCollection<Employee>(dataBaseEntities.Staff_Data_TBL 
      .Where(p => p.Section_Data == section && p.Staff_Bool == true) 
      .Select(staff => new Employee(staff.Staff_No ?? -1, 
       staff.Staff_Name_First, staff.Staff_Name_Second)) 
      .ToList() 
      .GroupBy(staff => staff.Key) 
      .Select(staff => staff.First()) 
      .OrderBy(staff => staff.Key) 
      .ToList()); 
    } 
}  

Und die Employee Klasse:

public class Employee 
{ 
    public int Key { get; set; } 
    public string FirstName { get; set; } 
    public string SecondName { get; set; } 
    public string FullName => FirstName + " " + SecondName; 

    public Employee(int key, string first = null, string second = null) 
    { 
     Key = key; 
     FirstName = first; 
     SecondName = second; 
    } 
} 

Und das ist die Klasse, die Entity Framework automatisch generiert:

public partial class Staff_Data_TBL 
{ 
    public long ID { get; set; } 
    public byte[] Image_Col { get; set; } 
    public Nullable<int> Staff_No { get; set; } 
    public string Staff_Name_First { get; set; } 
    public string Staff_Name_Second { get; set; } 
    public string Section_Data { get; set; } 
    public string Lic_Data { get; set; } 
    public Nullable<System.DateTime> Start_Date { get; set; } 
    public Nullable<System.DateTime> End_Date { get; set; } 
    public Nullable<long> Night_1 { get; set; } 
    public Nullable<long> Night_2 { get; set; } 
    public Nullable<long> Lunch_Data { get; set; } 
    public Nullable<long> Unples_Data { get; set; } 
    public string Staff_Part { get; set; } 
    public bool Staff_Kaizen { get; set; } 
    public int StaffKaizenPercentage { get; set; } 
    public Nullable<bool> Staff_Bool { get; set; } 
    public string Group_Section_Data { get; set; } 
    public string Notes { get; set; } 
} 

Bitte entschuldigen die Namenskonventionen, ich bin dabei, alles zu mehr Standard zu ändern Benennung.

Antwort

2

Erstellen Sie einen öffentlichen parameterlosen Konstruktor für Employee Klasse.

public Employee() {} 

Verwenden Objektinitialisierer statt Konstruktor mit Parametern:

 dataBaseEntities.Staff_Data_TBL 
     .Where(s => s.Section_Data == section && s.Staff_Bool == true) 
     .GroupBy(s => s.Staff_No) // Important, see notes below 
     .Select(g => g.FirstOrDefault()) 
     .OrderBy(s => s.Staff_No) 
     .Select(s => new Employee { 
      Key = s.Staff_No ?? -1, 
      FirstName = s.Staff_Name_First, 
      LastName = s.Staff_Name_Second 
      }) 
     .ToList() 

HINWEIS: Wie man sehen kann ich bewegt Gruppierung und vor Ergebnisse Projektion zu sortieren. Sie werden also alle Jobs auf der Serverseite ausführen, anstatt Tabellendaten in den Speicher zu laden.

+1

, die den Trick tat. Vielen Dank, ich bin schon so lange dabei. – KyloRen

+1

@KyloRen verwenden 'ToList()' sorgfältig sollte es das letzte sein, was Sie in der Abfrage verwenden. Andernfalls laden Sie alle Daten, bevor Sie herausfiltern, was Sie nicht benötigen. –

+0

Vielen Dank dafür, Sie haben mir geholfen, ein Problem zu verstehen, an dem ich mich schon lange nicht mehr erinnern kann (Especiallt mit Ihrer letzten Notiz). Ich werde diesen Rat auf jeden Fall auf der 'ToList()' nehmen. Tolles Zeug, nochmals vielen Dank. – KyloRen

0

ändern

public class Employee 
{ 
    public int Key { get; set; } 
    public string FirstName { get; set; } 
    public string SecondName { get; set; } 
    public string FullName => FirstName + " " + SecondName; 

    public Employee(int key, string first = null, string second = null) 
    { 
     Key = key; 
     FirstName = first; 
     SecondName = second; 
    } 
} 

zu

public class Employee 
{ 
    public Employee(){} //Constructor with no parameters that needs to be added 

    public int Key { get; set; } 
    public string FirstName { get; set; } 
    public string SecondName { get; set; } 
    public string FullName => FirstName + " " + SecondName; 

    public Employee(int key, string first = null, string second = null) 
    { 
     Key = key; 
     FirstName = first; 
     SecondName = second; 
    } 
} 
+0

Leider bekomme ich immer noch den gleichen Fehler damit. – KyloRen

Verwandte Themen