2014-07-06 2 views
3

웹 API 끝점 OData 쿼리에서 IEnumerable을 반환 할 때 쿼리 옵션을 적용하기 전에 열심히로드하는 것을 열거합니다.OData URL에서 지연로드 사용 쿼리

SomeType :

public class SomeType 
{ 
    public int SomeProp { get; set; } 
} 

엔드 포인트 : 여기 무슨 뜻인지입니다

public class SomeTypeController : ApiController 
{ 

    [EnableQuery] 
    public IEnumerable<SomeType> Get() 
    { 

     return GetSomeTypes(); 

    } 
    IEnumerable<SomeType> GetSomeTypes() 
    { 
     for (var i = 0; i < 10; i++) 
     { 

      Trace.WriteLine(i); 

      yield return new SomeType { SomeProp = i }; 
     } 
    } 
} 

/api/sometype?$top=2를 요청 나는이 선을 추적하기 위해 (0,1)를 기대하는 대신 내가 계속 루프를 참조 끝까지.

끝점 :

나는 (2) 반환하기 전에 테이크를 호출하는 것과 같은 동작을 기대

public class SomeTypeController : ApiController 
{ 

    [EnableQuery] 
    public IEnumerable<SomeType> Get() 
    { 

     return GetSomeTypes().Take(2); 

    } 
    IEnumerable<SomeType> GetSomeTypes() 
    { 
     for (var i = 0; i < 10; i++) 
     { 

      Trace.WriteLine(i); 

      yield return new SomeType { SomeProp = i }; 
     } 
    } 
} 

중 하나로, OData 쿼리 옵션에 대한 게으른 로딩에 전환 할 수있는 방법이 있나요?

OData를 사용하는 유일한 이유는 쿼리 옵션이기 때문에 자동 쿼리 옵션을 구현할 수있는 대안을 환영합니다.

답변

2

IEnumerable은 기본 orderby가 적용되므로 10 번 열거됩니다.

$ top에 안정적인 정렬이 필요하기 때문에이 동작이 의도적입니다.

이 작업을 원하지 않으면 EnsureStableOrdering을 false로 설정할 수 있습니다.

[EnableQuery(EnsureStableOrdering = false)] 
    public IEnumerable<SomeType> Get() 
    { 
     return GetSomeTypes().Take(2);  
    } 
+0

이제는 의미가 있습니다. 감사. –