2012-04-11 2 views
4
내 컨트롤러에 다음과 같은 패턴을 사용하고자하는

:ASP.NET 웹 API 된 IQueryable <T> 도전

API/{컨트롤러}/{ID}/{수집}

예 : api/customers/123/addresses

해당하는 Get 작업에서 IQueryable Of T을 반환하고 싶습니다. 나는 이와 같은 것을 원한다 :

public IQueryable<????> GetCollection(int id, string collection) 
{ 
    switch(collection) 
    { 
     case "addresses": 
      return _addresses.AsQueryable(); 
      break; 
     case "orders": 
      return _orders.AsQueryable(); 
      break; 
     default: 
      throw new Exception(NotSupported); 
    } 
} 

이 작업을 수행 할 수 있습니까?
권장되는 접근 방법은 무엇입니까?

답변

0

비 일반형 IQueryable 만 반환하십시오.
또는 IQueryable<object> 공분산.

+0

이러한 제안 모두 실패합니다. 두려워요. 두 경우 모두 예외가 발생합니다. –

+0

_ 어떤 오류가 발생합니까?_ – SLaks

+0

1) IQueryable 제공 : System.Runtime.Serialization.SerializationException : 형식 'System.Linq.EnumerableQuery'1 [[MvcApplication1.Controllers.Address, MvcApplication1, 버전 = 1.0.0.0, 문화 = 중립, PublicKeyToken = null]]' 데이터 계약 이름 'ArrayOfAddress : http : //schemas.datacontract.org/2004/07/MvcApplication1.Controllers'가 필요하지 않습니다. DataContractResolver를 사용하거나 KnownTypeAttribute 특성을 사용하거나 DataContractSerializer에 전달 된 알려진 형식 목록에 추가하여 알려진 형식 목록에 정적으로 알려지지 않은 형식을 추가하는 것이 좋습니다. –

6

@SLacks 가능한 경우 IQueryable<object> 또는 IQueryable<someBaseType>을 반환해야합니다.

점점 오류가 DataContract Serializer 함수입니다. 그래서 몇 가지 옵션이 있습니다.

  1. 원하는 것을 지원하는 대체 XML 직렬화기를 전환하십시오. 문제가되는 시리얼 라이저를 바이 패스 출력의 형태로
  2. Swtitch는
  3. 는 "가르치는"옵션에 대한

를 사용하여 객체를 직렬화하는 방법을 데이터 계약 serializer를 가르쳐 (JSON.net를 사용하여 JSON을 말한다) , 당신은 두 가지 방법으로 가르 칠 수 있습니다.

(A)[KnownType(typeof(...))] 속성을 이용합니다. 여기에 a post on the KnownType attribute입니다. WCF를위한 것이지만 시작해야합니다.

(B) 데이터 계약 리졸버를 사용하십시오. 이 post should get you started.

3

@Ebarr이 말한 것을 확장하면 가장 쉽게이 작업을 수행 할 수있는 방법은 반환 할 수있는 다양한 클래스를 업데이트하고 공통 기본 클래스 또는 인터페이스에서 상속 받도록하는 것입니다.

예 : [KnownType] 속성이 System.Runtime.Serialization에 있음을

public IQueryable<_BaseObject> GetCollection(int id, string collection) { 
    switch(collection) { 
     case "addresses": 
      return _addresses.AsQueryable(); 
     case "orders": 
      return _orders.AsQueryable(); 
     default: 
      throw new NotSupportedException(); 
    } 
} 

참고 :

[KnownType(typeof(Address))] 
[KnownType(typeof(Order))] 
public abstract class _BaseObject { } 

public partial class Address : _BaseObject { } 
public partial class Order : _BaseObject { } 

지금 당신이 같은 컨트롤러 방법 모양을 가질 수 있습니다. 또한이 방법을 사용하면 JSON 직렬화와 관련하여 정확히 예상 할 수있는 결과가 발생합니다. 그러나 XML 직렬화는 일반적으로 하위 클래스가 아닌 기본 클래스로 객체를 표시하는 태그를 생성합니다 (반환 된 값이기 때문에) 수업.