2014-06-11 5 views
2

, 나는 다음과 같은 사용자 정의 모델/DTO들 경우 :WebAPI OData expand 절을 강제로 적용하는 방법은 무엇입니까? 마이크로 소프트 WebAPI 중 하나로, OData 버전 5.6 (중 하나로, OData v3의)를 사용하여

public class ParentObject 
{ 
    public int ID { get; set; } 
    public string Title {get; set;} 
    public ChildObject Child { get; set;} 
} 

public class ChildObject 
{ 
    public string Value { get; set;} 
} 

그리고 모델로 내 데이터베이스 프로젝트는 다음 컨트롤러 :

public class ParentsController : ODataController 
{ 
    public IQueryable<ParentObject> Get() 
    { 
    var db = new MyDBContext(); 
    var results = from p in db.parent 
        select new ParentObject 
        { 
        ID = p.id, 
        Title = p.title, 
        Child = p.child == null ? null : new ChildObject 
        { 
         Value = p.child.value 
        } 
        }; 

    return results; 
    } 
    } 
} 

어떻게 URL에서 $ expand = Child를 지정해야하는 소비자없이 "하위"를 확장 할 수 있습니까? 소비자가 이미 "아이가"이미 확장 목록에 포함되지 않은 경우 = 아이에게
2를 확장 $ 지정된 경우를 포함
1.보고 :

나는 싶습니다.
3. 다른 쿼리 옵션을 반드시 준수하십시오.

필자에게 불명확 한 여러 온라인 기사를 보았거나 더 이상 일치하지 않는 이전 버전의 API를 참조했습니다. ,

if(opts.SelectExpand == null || !opts.SelectExpand.RawExpand.Contains("Child")) 
{ 
    // Add/modify expand clause here. 
} 

그러나 나는 수정하거나 내 자신의 ODataQueryOptions 객체를 구축하는 두 방법에 대한 명확하지 않다 :

나는 내가 그런 짓을하자하는 "(ODataQueryOptions가의 opts) 가져 오기"하는 동작을 수정 시도 다른 모든 쿼리 옵션을 유지 한 다음 결과에 적용합니다.

좀 진전이 1

업데이트. 다음은 컨트롤러에 관련 변경의합니다 (dbcontext 쿼리는 위와 같이 동일) : 나는 (expandOpts가 생성)은 "$ 확장"쿼리 옵션을 포함하지 않는 경우

public PageResult<ParentObject> Get(ODataQueryOptions opts) 
{ 
SelectExpandQueryOption expandOpts = null; 
if(opts.SelectExpand != null && !opts.SelectExpand.RawExpand.Contains("Child")) 
{ 
    expandOpts = new SelectExpandQueryOption(opts.SelectExpand.RawSelect, string.Join(",", new string[] {"Child", opts.SelectExpand.RawExpand }), opts.Context); 
} 
else if (opts.SelectExpand == null) 
{ 
    expandOpts = new SelectExpandQueryOption(null, "Child", opts.Context); 
} 

// Query from above goes here 

if(expandOpts != null) 
{ 
    Request.SetSelectExpandClause(expandOpts.SelectExpandClause); 
} 

var qSettings = new ODataQuerySettings(); 
qSettings.PageSize = 100; 

results = opts.ApplyTo(results, qSettings).AsQueryable() as IQueryable<ParentObject>; 
return new PageResult<ParentObject>(results, Request.GetNextPageLink(), Request.GetInlineCount()); 
} 

이 잘 작동하는 것 같다. 그러나 "$ expand"가있는 경우 return 문에 ArgumentNullExcpetion이 표시되어 이유를 파악할 수 없습니다.

+1

귀하의 기술 역시 저에게 효과적이었습니다. 답으로 써서 받아 들인 것으로 표시해야합니다. 유일한 차이점은'Request.SetSelectExpandClause'가 쓸모 없기 때문에'Request.ODataProperties(). SelectExpandClause' 속성을 대신 사용했습니다. –

답변

1

아래쪽을보세요 : http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/supporting-odata-query-options. MyQueryableAttribute가 필요한 것일 수 있습니다. 필요한 queryOptions.Expand를 삽입하는 사용자 정의 QueryableWithChildAttribute 클래스를 작성할 수 있습니다. 그런 다음 [QueryableWithChild()]으로 메소드를 꾸미십시오.

희망이 도움이됩니다.

+0

이것은 대답이 아니며이 페이지를 100 번 보았지만 어떻게 든 저를 올바르게 잡았습니다 경로 그래서 나는 이것을 대답으로 받아 들일 것이고 나의 게시물을 업데이트 할 것이다. – Tom

+0

나는 이것이 작동한다고 생각했지만 아직 완전히 작동하지는 않는다. 받아 들일 필요가없고 진행 상황에 대한 질문이 업데이트됩니다. 죄송합니다 :( – Tom

1

이 시간에 많은 시간을 보낸 후 이것이 대답입니다. 확장 문자열을 설정하고 include를 사용하여 작동되게해야합니다.

[EnableQuery] 
public IQueryable<Student> Get_Student(ODataQueryOptions<Student> queryOptions) 
{ 
var db = new EfCustomAdapter(); 

var expandOpts = new SelectExpandQueryOption(null, "Parent,Schools", queryOptions.Context); 
var q = db.Student.AsQueryable(); 
q = q.Include(t => t.Parent); 
q = q.Include(t => t.Schools); 
queryOptions.Request.ODataProperties().SelectExpandClause = expandOpts.SelectExpandClause; 
return q; 
} 

업데이트 : 당신이 구문은 아래

.. "부모, 학교, 청구서/지불을"레벨을 확장해야하는 경우 지불이 법안의 탐색 속성이있는 객체.