, 나는 다음과 같은 사용자 정의 모델/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이 표시되어 이유를 파악할 수 없습니다.
귀하의 기술 역시 저에게 효과적이었습니다. 답으로 써서 받아 들인 것으로 표시해야합니다. 유일한 차이점은'Request.SetSelectExpandClause'가 쓸모 없기 때문에'Request.ODataProperties(). SelectExpandClause' 속성을 대신 사용했습니다. –