>

데이터베이스에서 직원의 정보를 가져 오는 방법이 있습니다. 방법은 다음과 같습니다. 스위치 케이스

public void RetrieveEmployeeInfo(EmployeeInfoRequest request)
{
    EmployeeStandardInfoResponse response;
    int employeeId;
    switch (request.Type.ToLowerInvariant())
    {
        case "employeeid":
            //Some Logic
            response = GetEmployeeInfoFromDatabase(EmployeeSearchType.ByEmployeeID, employeeId);
            break;
        case "emailaddress":
            //Some Logic
            response = GetEmployeeInfoFromDatabase(EmployeeSearchType.ByEmailAddress, emailAddress:request.Id);
            break;
        default:
            return null;
    }
    return response;
}

"GetEmployeeInfoFromDatabase"의 서명은

public EmployeeStandardInfoResponse GetEmployeeInfoFromDatabase(EmployeeSearchType employeeSearchType, dynamic value)
{
    //For simplicity I am returning employee info here
    return new EmployeeStandardInfoResponse();
}

지원 클래스와 Enum은 다음과 같습니다

public enum EmployeeSearchType
{
    ByEmployeeID = 1,
    ByEmailAddress = 2
}
public class EmployeeInfoRequest
{
    public int Id;
    public string Type;
}
public class EmployeeStandardInfoResponse
{
    public int employeeReferenceId;
    public string employeeDepartment;
    public string employeePfDetails;
    public string employeeName;
    public string employeeEmailAddress;
    public string employeeAddress;
}

모든 경우에 "GetEmployeeInfoFromDatabase"메소드를 호출 할 필요가 없도록 스위치 케이스를 일반화하려면 어떻게해야합니까?


  • 답변 # 1

    아래는 완전 블로운 솔루션이 아닙니다. 달성하고자하는 것을 도울만큼 충분합니다. 아이디어는 : 사용자 검색 기준에 따라 람다 식 구문을 사용하여 식 트리를 만듭니다. 리포지토리의 최종 메서드에서 DB에서 정보를 가져 오기 위해 해당 표현식을 전달하고 구문 분석 (예 : DB SQL 쿼리 가져 오기) 할 수 있습니다.

    public class Program
        {
            static void Main()
            {
                GetEmployeeInfoFromDatabase((e) => e.EmployeeEmail == "UserProvidedEmailAdderessGoesHere");
            }
            public EmployeeStandardInfoResponse static GetEmployeeInfoFromDatabase(Expression<Func<Employee,bool>> exprssion)
            {
               /* parse this exression to build query*/
               /* use as it is if using entity framework*/
            }
        }
        class Employee
        {
            public int EmployeeId { get; set; }
            public string EmployeeEmail { get; set; }
        }
    }
    
    

    이에 대한 두 번째/세 번째 답변 스택 오버 플로우 포스트는 번역 로직을 쿼리하는 표현을 아름답게 설명합니다.

    계속해서 더 재사용 가능하고 일반화 할 수 있습니다 (Personal 엔터티에만 국한되지 않음)

    public EmployeeStandardInfoResponse static GetEmployeeInfoFromDatabase<T>(Expression<Func<T,bool>> exprssion)
                {
                   /* parse this expression to build query*/
                   /* use as it is if using entity framework*/
                }
    
    

관련 자료

  • 이전 jquery - Javascript 다음 코드 줄의 차이점은 무엇입니까?
  • 다음 node.js - http가 아닌 eventsEventEmitter ()에서 인스턴스를 만드는 이유는 무엇입니까?