我有一个像这样的员工类:
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;
}
}
“性别”的类型为Enum:
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查询,这也是有道理的。 那有什么简单的解决方法吗?我的意思是这种功能(使用转换功能)在应用程序中非常常见,微软人员必须考虑到这一点。 我想知道我在这里完全没有的东西。
答案 0 :(得分:1)
Linq to entities不支持查询中的枚举,因此有几种方法可以使用。
您可以将值存储为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);
如果你想进一步简化,我会建议将get 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; }
}
}