LINQ查询,用于将数据存储在具有枚举类型的类类型中

本文关键字:类型 枚举 查询 用于 存储 数据 LINQ | 更新日期: 2023-09-27 18:00:48

我有一个Employee类,如下所示:

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.Generder ConvertToGender(System.String)"方法,并且此方法无法转换为存储表达式。

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

LINQ查询,用于将数据存储在具有枚举类型的类类型中

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

您可以将该值存储为Employee类上的字符串,然后将其转换为linq到对象,并设置如下枚举值:

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

如果你想进一步简化,我建议将empGender上的get修改为这样,以避免第二次调用:

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

}