2013-02-25 51 views
1

我有一個Employee類,像這樣:LINQ查詢數據存儲在一個類類型具有枚舉類型

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查詢,它也是有意義的。 那麼有沒有簡單的解決方法?我的意思是這種功能(使用轉換功能)在應用程序中非常常見,微軟人員必須考慮到這一點。 我想知道我完全想念的東西。

+0

你會驚訝,但「公共枚舉性別{男,女} 「 是不足夠的。有很多的人誰也不會能夠選擇男性還是女性,並考慮到你建立一個工作人員相關的軟件,你可以迅速用歧視官司結束了。 – 2013-02-25 06:25:58

+0

哪個版本的實體框架是這樣的? – 2013-02-25 08:40:52

+0

那麼,第三性別的標題可能是什麼? – GaganLamba 2013-02-27 19:42:05

回答

1

LINQ到實體不支持的枚舉查詢,以便有幾個方法,你可以走了。

您可以將值存儲爲上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; } 
} 

}

+0

謝謝Tj凱利,這對我來說很成功。 – GaganLamba 2013-02-28 01:41:13

+1

您能接受這個答案的話,看到http://stackoverflow.com/faq#howtoask – Jobo 2013-03-02 00:17:52