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 onempGender
修改为类似这样的内容,以避免第二次呼叫:
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 onempGender
修改为类似这样的内容,以避免第二次呼叫:
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; }
}
}您可能会感到惊讶,但“公共枚举性别{男性,女性}”还不够。有很多人不能选择男性或女性,考虑到你正在构建一个与员工相关的软件,你可能很快就会以歧视诉讼告终。这是实体框架的哪个版本?那么第三种性别的标题是什么?你会感到惊讶,但“公共枚举性别{男性,女性}”这还不够。有很多人不能选择男性或女性,而且考虑到你正在构建一个与员工相关的软件,你很快就会被歧视诉讼所终结。这是哪个版本的实体框架?那么第三种性别的标题是什么?