2014-04-21 1 views
4

나는 query interceptors에 대해 읽었습니다. 나는 인터셉터 대신에 필터와 더 비슷하기 때문에 실망했다. 즉, 레코드를 포함하거나 포함하지 않을 수 있습니다. 예를 들어 레코드를 수정할 수 없습니다. 내가 대신 작업을 만들 경우 어떻게쿼리 인터셉터 대신 작업 (WCF 데이터 서비스)

[QueryInterceptor("Users")] // apply to table users 
public Expression<Func<User, bool>> UsersOnRead() 
{ 
    return cust => cust.IsDeleted == false; 
} 

: 나는 다음과 같은 일을 할 수있는 나의 실체 Users에 대한 쿼리 인터셉터를 만들려면

참고 조작 이름을 가질 것이 매우 중요합니다 그냥 엔티티 이름 LIKE 그렇지 않으면 쿼리 인터셉터 대신이 방법을 배치

[WebGet] 
public IEnumerable<User> Users() 
{      
    return this.CurrentDataSource.Users.Where(x=>x.IsDeleted==false); 
} 

작동하지 않습니다 나의 서비스 behav한다 정확히 똑같습니다. 게다가 나는 더 많은 힘을 가지고있다! 이 접근법을 더 나은 해결책으로 삼고 있습니까?

+0

매우 흥미로운 일입니다. 엔티티에 대한 업데이트가 작동합니까? 아니면 WebGet이 엔티티에 대한 업데이트를 덮어 씁니까? 또한 쿼리 옵션을 지원하려면 IEnumerable 대신 IQueryable을 노출해야합니다. 저는 WCF 팀이이 상황을 생각하지 않았다고 생각합니다. 그래서 어떤 문제가 생기면 스스로 할 수 있습니다. – CharlesNRice

+0

참조를 업데이트하려면 해당 작업의 주석 처리를 제거해야합니다. 일단 클라이언트 응용 프로그램에 서비스 참조를 추가하면 해당 작업의 주석을 제거 할 수 있으며 잘 작동합니다. –

답변

5

나는 이것으로 조금 더 놀았고 문제 중 하나는 탐색 속성이 필터링되지 않는다는 것입니다. 의 당신은 당신이 당신의 하나로, OData는 WCFDataService.svc/영업 사원처럼 먹이를 조회

[QueryInterceptor("Customers")] // only show active customers 
public Expression<Func<Customers, bool>> ActiveCustomers() 
{ 
    return cust => cust.IsDeleted == false; 
} 

을 할 경우 고객

의 IEnumberable에 링크가 엔티티라는 영업 사원 있다고 가정 해 봅시다? $ 결과가 설정 = 고객을 확장 고객을 위해 여전히 필터가 적용됩니다.

그러나이

[WebGet] 
public IQueryable<Customers> Customers() 
{      
    return this.CurrentDataSource.Customers.Where(x=>x.IsDeleted==false); 
} 

WCFDataService.svc/고객 등의 실행 중 하나로, OData 쿼리는 활성 고객의 필터링 된 목록을해야하지만이 WCFDataService.svc/영업 사원을 실행할 때? $은 결과가 설정 = 고객을 확장 고객에게는 삭제 된 고객이 포함됩니다.