Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在具有枚举类型的类类型中存储数据的LINQ查询_C#_Linq To Entities - Fatal编程技术网

C# 在具有枚举类型的类类型中存储数据的LINQ查询

C# 在具有枚举类型的类类型中存储数据的LINQ查询,c#,linq-to-entities,C#,Linq To Entities,我有一个这样的员工类: public class Employee { public Int32 employeeId; public String employeeFName; public String employeeSName; public Gender empGender; public string empContactNo; public DateTime empDOB;

我有一个这样的员工类:

public class Employee    
{  
    public Int32 employeeId;    
    public String employeeFName;    
    public String employeeSName;    
    public Gender empGender;    
    public string empContactNo;    
    public DateTime empDOB;    
    public string empAddress;    
    public Int16 accessLevel;    
    private string pass;    


    public String Pass
    {
        get { return this.pass; }
        set { this.pass = value; }
    }

    public static Gender ConvertToGender(string gen)
    {
        if (gen == "Male")
            return Gender.Male;
        else
            return Gender.Female;
    }
}
其中“性别”为枚举类型:

public enum Gender { Male, Female }    
我正在使用以下LINQ查询:

var query = from emp in hmsdatabase.TblEmployees  
               where emp.EmpId == employeeid  
               select new Employee()  
               {  
                    employeeId = emp.EmpId,  
                    employeeFName = emp.EmpFirstName,  
                    employeeSName = emp.EmpSurName,  
                    empGender = Employee.ConvertToGender(emp.EmpGender),  
                    empContactNo = emp.EmpContactNo,  
                    empDOB = DateTime.Parse(emp.EmpDOB.ToString()),  
                    empAddress = emp.EmpAddress,  
                    accessLevel = Int16.Parse(emp.EmpAccessRight.ToString())  
               };  
尽管编译过程中没有错误,但在运行时我遇到以下错误:

System.NotSupportedException:LINQ to Entities无法识别方法“HMSTest.Gender ConvertToGender(System.String)”方法,并且无法将此方法转换为存储表达式

我已经研究过这个错误,我知道它不起作用,因为LINQ无法将用户定义的函数“Employee.ConvertToGender(string)”转换为等效的SQL查询,这也是有意义的。 那么有什么简单的解决方法吗??我的意思是,这种功能(使用转换功能)在应用程序中非常常见,微软的人一定已经想到了这一点。
我想知道我在这里完全缺少的东西。

Linq to entities不支持查询中的枚举,因此有几种方法可以使用

您可以将该值作为字符串存储在
Employee
类中,然后将其转换为linq to objects,并按如下方式设置枚举值:

var objEmpl = (from emp in hmsdatabase.TblEmployees  
           where emp.EmpId == employeeid  
           select new Employee()  
           {  
                employeeId = emp.EmpId,  
                employeeFName = emp.EmpFirstName,  
                employeeSName = emp.EmpSurName,  
                empGenderString = emp.EmpGender,  
                empContactNo = emp.EmpContactNo,  
                empDOB = DateTime.Parse(emp.EmpDOB.ToString()),  
                empAddress = emp.EmpAddress,  
                accessLevel = Int16.Parse(emp.EmpAccessRight.ToString())  
           } ).FirstOrDefault();
    objEmpl.empGender = Employee.ConvertToGender(objEmpl.empGenderString);
如果您想进一步简化,我建议将get on
empGender
修改为类似这样的内容,以避免第二次呼叫:

public class Employee    
{  
  public Int32 employeeId;    
  public String employeeFName;    
  public String employeeSName;         
  public string empGenderString;
  public string empContactNo;    
  public DateTime empDOB;    
  public string empAddress;    
  public Int16 accessLevel;    
  private string pass;    

public Gender empGender
{
    get { return this.empGenderString == "Male" ?
                 Gender.Male:
                 Gender.Female;
        }

public String Pass
{
    get { return this.pass; }
    set { this.pass = value; }
}

}

Linq to entities不支持查询中的枚举,因此有几种方法可供选择

您可以将该值作为字符串存储在
Employee
类中,然后将其转换为linq to objects,并按如下方式设置枚举值:

var objEmpl = (from emp in hmsdatabase.TblEmployees  
           where emp.EmpId == employeeid  
           select new Employee()  
           {  
                employeeId = emp.EmpId,  
                employeeFName = emp.EmpFirstName,  
                employeeSName = emp.EmpSurName,  
                empGenderString = emp.EmpGender,  
                empContactNo = emp.EmpContactNo,  
                empDOB = DateTime.Parse(emp.EmpDOB.ToString()),  
                empAddress = emp.EmpAddress,  
                accessLevel = Int16.Parse(emp.EmpAccessRight.ToString())  
           } ).FirstOrDefault();
    objEmpl.empGender = Employee.ConvertToGender(objEmpl.empGenderString);
如果您想进一步简化,我建议将get on
empGender
修改为类似这样的内容,以避免第二次呼叫:

public class Employee    
{  
  public Int32 employeeId;    
  public String employeeFName;    
  public String employeeSName;         
  public string empGenderString;
  public string empContactNo;    
  public DateTime empDOB;    
  public string empAddress;    
  public Int16 accessLevel;    
  private string pass;    

public Gender empGender
{
    get { return this.empGenderString == "Male" ?
                 Gender.Male:
                 Gender.Female;
        }

public String Pass
{
    get { return this.pass; }
    set { this.pass = value; }
}

}

您可能会感到惊讶,但“公共枚举性别{男性,女性}”还不够。有很多人不能选择男性或女性,考虑到你正在构建一个与员工相关的软件,你可能很快就会以歧视诉讼告终。这是实体框架的哪个版本?那么第三种性别的标题是什么?你会感到惊讶,但“公共枚举性别{男性,女性}”这还不够。有很多人不能选择男性或女性,而且考虑到你正在构建一个与员工相关的软件,你很快就会被歧视诉讼所终结。这是哪个版本的实体框架?那么第三种性别的标题是什么?