2012-11-14 3 views
1

을 선택 리팩토링 방법 :EF에서의 부품의 내가 다음 EF 코드가 있다고 가정 해 봅시다

context.Employees.Select(e => e 
{ 
    FullName = e.FirstName + " " + e.LastName, 
    StartDate = e.StartDate, 
    ... // Grab other data 
}; 

을 이제 어쩌면 내가 여러 위치에 전체 이름을 구성하는 것을 알 수 있지만, 중앙에 싶습니다. 이것을 리펙토링 할 수 있습니까?

내가 방법이나 Func로 만들면 SQL로 변환 할 수 없기 때문에 EF 오류가 발생합니다.

참고 : 이것은 "선택", "위치", 할당 내용에 관계없이 훨씬 복잡해 지므로 ToList를 추가 한 다음 추가 코드를 실행하면 차선책이되고 기능을 변경해야하며 유지 보수가 용이하지 않기 때문에 리팩토링의 정의에 부합해야합니다.

답변

0

하나의 해결책은 LinqKit에서 AsExpandable 방법을 사용하는 것입니다 : 링크 된 기사에서

Expression<Func<Employee,string>> fullName = e => e.FirstName + " " + e.LastName; 
context.Employees.AsExpandable().Select(e => e 
{ 
    FullName = fullName.Compile().Invoke(e), 
    StartDate = e.StartDate, 
    ... // Grab other data 
}; 

:

컴파일이 표현 클래스의 붙박이 방법이다. 표현식을 이 컴파일러를 만족시키는 일반 Func으로 변환합니다. 물론이 방법을 실제로 실행하면 이 표현식 트리 대신 컴파일 된 IL 코드로 끝나고 SQL 또는 Entity Framework에 LINQ 이 예외를 throw합니다. 하지만 영리한 부분은 다음과 같습니다. 컴파일은 실제로 실행되지 않습니다. LINQ to SQL 또는 Entity Framework에서도이 기능을 볼 수 없습니다. 컴파일 호출은 AsExpandable을 호출하고 올바른 식 트리를 대신하여 작성한 특수 래퍼를 사용하여 완전히 을 제거합니다.

또는 Model Defined Function을 Entity Framework로 만들 수 있습니다. Employee 클래스 자체에 FullName 속성을 정의하려는 경우 Microsoft.Linq.Translations 라이브러리도 있습니다.

0

저는 엔티티 클래스 자체에서보다 중앙 집중화 된 방법을 사용한다고 생각합니다. ReadOnly 속성을 데이터베이스에 대해 NotMapped이어야하는 엔티티 클래스에 추가하여 필요한 형식의 데이터를 반환 할 수 있습니다.

Public class Employee 
{ 
//... 

public string fullName{get { return FirstName + " " + LastName;}} 
} 
관련 문제