2013-04-26 1 views
0

.All() 쿼리 은 하위 엔터티가없는 기본 엔터티를으로 반환합니다. 예를 들어, 두 개의 고객 만있는 데이터베이스를 상상해보십시오. 주문은 BuyerName 열이있는 하위 엔터티입니다. 하나의 고객 레코드에는 두 명의 다른 구매자로부터 두 차례의 주문이 있고 다른 고객에게는 주문이 없습니다.WCF Data Services 클라이언트의 하위 엔터티에 .All()을 호출하면 하위 엔터티가없는 경우 기본 엔터티를 반환하는 이유는 무엇입니까?

다음 쿼리는 두 명의 다른 구매자 (예상 한 것과 같음)이기 때문에 두 개의 주문이있는 고객을 반환하지 않지만 주문이없는 고객은 반환합니다. 추가 .Any() 쿼리를 추가함으로써

query.Where(c => c.Orders.All(
      o => o.BuyerName == buyer.Name)); 

, 나는 내가 .All() 쿼리가 자동으로 나를 위해했을 것이라고 생각했을 것이다 것을 얻을.

query.Where(c => c.Orders.All(
      o => o.BuyerName == buyer.Name) 
      && c.Orders.Any()); 

이것은 최소한의 놀라움의 원칙을 위반하는 것으로 보입니다. .All()을 호출하면 하위 엔티티가 없을 때 기본 엔티티가 반환되지 않아야한다고 생각합니다. 따라서 하위 엔터티가없는 경우 WCF Data Services 클라이언트 내의 .All()이 기본 엔터티를 반환하는 이유는 무엇입니까?

답변

3

초당 OData 및 WCF 데이터 서비스는 잊어 버리십시오. 이 코드는 무엇을 생산해야합니까? 목록에는 항목이 없기 때문에

내가 제대로 질문을 이해한다면
IEnumerable<string> emptyEnumerable = Enumerable.Empty<string>(); 
bool result = emptyEnumerable.All(item => item == "foo"); 

, 당신은 result를 기대하고하는 것은 거짓입니다. 그러나 result 사실이 사실이 될 것입니다. MSDN documentation에서, 당신은 .All()의 반환 값이

으로 설명되어 있음을 볼 수있다 "소스 시퀀스의 모든 요소가 true 지정된 조건, 의 테스트를 통과하거나 경우 순서는 비어있는 경우이고, 그렇지 않으면 false입니다. "

지금까지 내가 본 것처럼, 이것은 All()과 같은 어떤 언어에 대한 동작이다 (그리고 나는 이것을 필요로하는 술어 로직의 기초에 뭔가가 있다고 생각한다).

WCF Data Services와 OData는이를 염두에두고 다른 모든 곳에서 사용되는 동일한 계약을 따르고 있습니다. 은 c.Orders이 비어있는 경우 항상 true를 반환합니다. 첫 번째 쿼리에서는 c.Orders이 비어있는 c이 필터 조건자를 전달한다는 것을 의미합니다. 언급 한 것처럼 c.Orders.Any()도 true로 요구하여 c.Orders에 적어도 하나의 항목이 있다고 주장하여 필터 조건자를 더 강하게 만들 수 있습니다.

+0

대단한 답변을 보내 주셔서 감사합니다. –