2010-04-01 2 views
0

LINQ to SQL 데이터 공급자를 기반으로하는 WCF 데이터 서비스가 있습니다.요청시 누락 된 데이터를 종합하기 위해 WCF 데이터 서비스 확장

"두 날짜 사이에 모든 레코드를 가져 오십시오"라는 쿼리를 생성하고 있습니다.

문제는 내가 항상 시작 및 종료 날짜에 해당하는 레코드와 그 중간에있는 모든 레코드를 데이터베이스에서 가져 오는 두 개의 추가 레코드를 합성하려고한다는 것입니다.

요청을 "가로 채서"이러한 레코드를 종합하여 클라이언트에 반환 할 수있는 방법이 있습니까?

감사합니다.

답변

0

이 더 많은 내가 더 내가 "이 작업을 수행하지 마십시오"말을 생각해 ...이 우연히 발견했다. 문제는 WCF Data Services (또는 해당 OData)에서 반환하는 각 엔터티 (엔터티 == 레코드)가 고유 한 URI를 가져야한다는 것입니다. 또한 클라이언트는 엔터티가 서버에서 반환 된 경우 (삭제되지 않은 경우) 엔티티에 다시 액세스 할 수 있다고 가정합니다. 귀하의 경우에는 경계 엔티티가 쿼리에 의해 정의되며 실제로는 쿼리의 컨텍스트에만 존재합니다. 주어진 다른 쿼리와는 다릅니다. 즉, 엔티티처럼 작동하지 않으며, 일종의 쿼리 메타 데이터처럼 행동합니다.

정말로 이것이 올바른 일이라고 생각한다면 ... 이렇게하는 것이 다소 어렵습니다. 내가 생각할 수있는 유일한 접근법은 엔티티 집합에서 반환 된 IQueryable에 연결하는 것입니다 (LINQ에서 SQL까지 하나의 계층에 사용자 고유의 IQueryable을 계층화합니다). 그런 다음 쿼리가 실행되면 표현식 트리를 구문 분석하고 범위를 정의하는 조건을 찾은 다음 시작과 끝에서 두 개의 특수 엔터티를 "합성"하는 IEnumerable의 사용자 지정 구현을 반환합니다. 기본 LINQ에서 SQL 결과로 둡니다. 이 모든 것은 많은 코드이며, 그렇게하는 것이 쉽지 않습니다.

두 번째 가능한 방법은 서비스 작업으로 구현하는 것입니다 (클라이언트가 서버에서 특별한 작업을 수행해야한다는 것을 알고 있어야합니다). 또한 서비스 조작은 필터가 아닌 매개 변수로 범위를 가져 오므로 범위를 알아내는 것이 훨씬 쉽습니다 (표현식 트리 구문 분석 없음).

+0

나는이 문제가 발생한 모든 이유가 MS가 나쁜 습관이라고 생각하기 때문에 ... DataService <> 클래스를 사용하여 OData를 통해 데이터베이스를 노출하는 쉬운 방법을 제공합니다. 그렇기 때문에 누구나 쉽게 할 수 있습니다.하지만 구현 정보 (db 스키마)를 외부 세계에 노출시키는 것이 좋은 생각입니까? – Schneider

+0

실제로 DB와 DataService 사이에 EF를 사용하는 것이 좋습니다. 그렇게하면 구현 세부 사항이 노출되지 않습니다. 대신 올바른 EF 모델을 사용하여 어떤 부품과 노출 방법을 선택할 수 있습니다. LINQ to SQL을 사용하면 DB 스키마를 숨길 수있는 가능성이 있지만 그다지 풍부하지는 않습니다. –

관련 문제