2010-07-15 2 views
3

한 유형의 객체를 다른 유형으로 변환하는 Expression이 있습니다. 표현식은 다음과 같다 :Linq select 절 (쿼리 형식)에서 표현식 다시 사용

public Expression<Func<SQLRepository.ActionType, Model.ActionType>> DBActionTypeToActionType = 
(SQLRepository.ActionType at) => new Model.ActionType() 
{ 
    ID = at.OID, 
    DisplayName = at.DisplayName 
}; 

나는 이런 식 사용할 수 있습니다

var linq = (from at in dc.SQLRepositoryDC.ActionTypes select at).Select(DBActionTypeToActionType); 

을하지만이처럼 사용하고 싶습니다 : 봤는데

var linq = (from at in dc.SQLRepositoryDC.ActionTypes select DBActionTypeToActionType.Compile().Invoke(at)); 

이제 며칠을 찾고 Where 절에서이 작업을 수행하는 것에 대한 참조 만 찾을 수 있습니다. 이렇게하려면 함수 호출을 사용할 수 있다면 쿼리 구문을 사용하여 가능해야합니다.

쿼리 구문을 사용하는 것이 중요한 이유는 선택되는 개체 중 일부가 많은 하위 개체로 구성되어 있으며 모든 변환을 함수 표기법과 함께 연결하려고하면 훨씬 더 어려워집니다 쓰고 유지하기.

답변

4

이 작업을 위해 함수 호출을 사용할 수 있다면 쿼리 구문을 사용하여 가능해야합니다.

사실이 아닙니다. 쿼리 표기법 항상은 람다 식을 통해 이동합니다. 예를 들어

from x in y select z 

당신은 쿼리 표현식을 사용할 수 없습니다, 당신은 이미 당신이 Select에 인수로 직접 전달하려는 식 트리를 가지고있는 경우에 의미

y.Select(x => z) 

로 끝나는 때문에 이 간접비의 추가 수준이 있습니다.

이제 사용 가능한 옵션은 미리 정의 된 표현식을 적용해야하는 위치에 따라 달라집니다. 당신은 항상 소스에서 사용하고 쿼리를 계속 할 수 있습니다

var query = from foo in dc.ActionTypes.Select(DBActionTypeToActionType) 
      where foo.Stuff 
      select foo.Other; 

또는 말을 사용하는 것은 간단하다

var query = (from bar in dc.ActionTypes 
      where bar.Stuff 
      select bar).Select(DBActionTypeToActionType); 

전혀 그 도움을합니까?

+0

네, 그게 크게 도움이됩니다. _BEFORE_ 테이블에 select 함수를 적용하는 것을 고려하지 않았지만 모든 데이터를 수집 한 후에이를 수행하려고 노력했습니다. 대단히 감사합니다. –