【问题标题】:Only parameterless constructors and initializers for Entities?只有实体的无参数构造函数和初始化器?
【发布时间】:2017-07-15 07:07:36
【问题描述】:

我收到此错误,

LINQ 仅支持无参数构造函数和初始化程序 到实体。

经过研究,这似乎是一个有很多答案的常见问题。除了我不能对很多答案进行逆向工程,以便我自己解决这个问题。

我意识到答案在错误中,但我看不到需要使用无参数构造函数吗?或者在这个例子中,我什至不知道参数在哪里???

这个 LINQ 查询给我带来了麻烦:

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());
    }
}    

还有Employee 类:

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;
    }
}

这是实体框架自动生成的类:

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; }
}

请原谅命名约定,我正在将所有内容更改为更标准的命名。

【问题讨论】:

    标签: c# entity-framework linq linq-to-entities


    【解决方案1】:

    Employee 类创建公共无参数构造函数。

    public Employee() {}
    

    使用对象初始化器而不是带参数的构造器:

         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()
    

    注意:如您所见,我在结果投影之前移动了分组和排序。因此,您将在服务器端完成所有工作,而不是将表数据加载到内存中。

    【讨论】:

    • 成功了。非常感谢,我已经在这很长时间了。
    • @KyloRen 小心使用ToList(),它应该是您在查询中使用的最后一件事。否则,您将在过滤掉不需要的数据之前加载所有数据。
    • 非常感谢,您帮助我理解了我一直在处理的一个问题,因为我不记得有多久了(特别是最后一个注释)。我一定会在ToList() 上接受这个建议。很棒的东西,再次感谢。
    【解决方案2】:

    改变

    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;
        }
    }
    

    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;
        }
    }
    

    【讨论】:

    • 不幸的是,我仍然遇到同样的错误。
    猜你喜欢
    • 2015-12-15
    • 1970-01-01
    • 1970-01-01
    • 2019-10-24
    • 2013-11-17
    • 1970-01-01
    • 2018-06-30
    • 2019-10-07
    • 1970-01-01
    相关资源
    最近更新 更多