1

次のような 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.Gender ConvertToGender(System.String)' メソッドを認識せず、このメソッドはストア式に変換できません。

このエラーについて調査しましたが、LINQ はユーザー定義関数 'Employee.ConvertToGender(string)' を同等の SQL クエリに変換できないため、機能しないことがわかっています。これも理にかなっています。では、簡単な回避策はありますか?? この種の機能 (変換関数を使用する) はアプリケーションで非常に一般的であるため、Microsoft の担当者はこれについて考えたに違いありません。ここで完全に欠けている何かについて知りたいです。

4

1 に答える 1

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 onempGenderを次のように変更して、2 回目の呼び出しを回避することをお勧めします。

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

}

于 2013-02-25T05:53:29.947 に答える