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