2011-01-13 4 views
4

Func을 사용하여 LINQ to SQL 쿼리에서 투영법을 사용할 때 예기치 않은 동작이 나타납니다. 예제 코드는 단어보다 잘 설명 할 것입니다. LINQ to SQL Projection : Func 대 인라인

기본 L2S 람다 조회하여 투영 :

그것은 원하는 SQL로 변환
db.Entities.Select(e => new DTO(e.Value)); 

그러나

SELECT [t1].[Value] 
FROM [Entity] AS [t1] 

투영이 같은 Func을 투입된다

Func<Entity, DTO> ToDTO = (e) => new DTO(e.Value); 

다음과 같이 호출 :

db.Entities.Select(e => ToDTO(e)); 

는 SQL 이제 투영뿐만 아니라 하나의 테이블에 다시 모든 열을 당기고 :

SELECT [t1].[Id], [t1].[Value], [t1].[timestamp], [t1].[etc...] 
FROM [Entity] AS [t1] 

그래서 내 질문, 어떻게 SQL에 LINQ없이 투영 캡슐화 않는있다 전체 엔터티 인스턴스화?

내가 사용하는 DTO에는 보호 된 기본 생성자가 있으므로 개체 이니셜 라이저를 사용할 수 없습니다. 그리고 DTO 클래스는 수정할 수 없으므로, 그 동작을 구현하기 위해 서브 클래스를 만들어야합니다. 그게 유일한 해결책이라면 괜찮습니다.

감사합니다.

편집 :

해결책은 Brian에게 감사드립니다. 이전에 표현식을 시도했지만 구문을 파악할 수 없었습니다. 여기에 작업 코드는 다음과 같습니다

Expression<Entity, DTO> ToDTO = (e) => new DTO(e.Value); 

다음과 같이 호출 : 처음에는

db.Entities.Select(ToDTO); 

내가 컴파일되지 않을 것이다, 이런 식으로 전화를 시도했다. 이것은 Func를 호출하기위한 적절한 구문이지만 Expression은 호출 할 수 없습니다. , 당신은 아마 호출 할

db.Entities.Select(e => ToDTO(e)); 

답변

5

당신은 아마 Func

Expression<Func<Entity, DTO>> ToDTO = (e) => new DTO(e.Value); 

된 IQueryable 확장 메서드는 Func를 전달하여 Expression의하지 Func

작동하지 않은 Expression를 작성해야 IEnumerable 확장 방법, Linq2Sql이 작동하는 이유입니다.

+0

어떻게 호출합니까? 나는 이것을 시도했지만 컴파일 할 코드를 얻을 수 없었다. – mikesigs

+0

좋아, 나는 일하도록했다. 코드가 어떻게 될지 예상하지 않았습니다. 그러나 그것은 완벽하게 감사했습니다! – mikesigs

+0

어떻게 * DID * 당신이 그것을 호출 ???! :-디 –