2014-04-26 2 views
3

엔티티를 평평하게하는 LINQ 쿼리에서 생성 된 일부 데이터를 반환해야하는 웹 API odata 서비스가 있습니다. 예를 들어, 데이터 서비스 측에서 LINQ를 사용하여 새로운 속성을 생성하는 명령 목록을 가지고 있습니다. 예를 들어, 0에서 100 사이의 수를 갖는 수를 반환하고 그 사이의 수를 가질 다른 속성을 반환하고자합니다 101 및 200 등. 여기에 간단한 예가 나와 있습니다. 다음과 같은 코드 내 WebApiConfig에서
.NET 서비스 OData는 LINQ 쿼리에서 익명 형식을 반환합니다.

Public IHttpActionResult GetCustomData() 
{ 
    var query = (from o in Orders 
      select CustomerName = o.CustomerName, 
      LowerCount = o.OrderDetails.Where(f => f.Pieces >= 0 && f.Pieces <= 100).Count(), 
      MidCount = o.OrderDetails.Where(f => f.Pieces >= 101 && f.Pieces <= 200).Count(), 
      HighCount = o.OrderDetails.Where(f => f.Pieces >= 201).Count() 
      ); 

    return Ok(query); 
} 

가 i를 FunctionConfiguration :

FunctionConfiguration getCustomData = builder.EntityType<Order>().Collection.Function("GetCustomData"); 
getCustomData.Returns<Object>(); 

URL이 나를 올바르게 함수를 호출 할 수 있지만, JSON 반환은 빈 배열이 포함되어 있습니다. 예를 들어, 반환 할 레코드가 6 개있는 경우 Json은 내부에 6 개의 빈 []이 있습니다.

또한 Newtonsoft.Json.Linq.JObject를 반환하고 Newtonsoft를 사용하여 Lync를 Json으로 직렬화했지만 런타임 오류가 발생합니다.
"복잡한 유형 'JToken'은 '부모'속성을 통해 자체에 대한 참조를 가지고 있습니다. 복잡한 유형의 순환 루프는 허용되지 않습니다."

이 문제를 해결하기 위해 사용자 지정 클래스를 만들 수 있지만 클라이언트가 일반 탭을 클라이언트에게 보내고 데이터를 읽을 수 있도록 일반 Json을 클라이언트에 보낼 수있는 쉬운 방법이 있어야한다는 것을 알고 있습니다.
클라이언트가 데이터를 "계산"할 수 있도록 전체 주문/주문 세부 정보를 보낼 수 있지만 웹 서비스에서 오는 페이로드를 작게 유지하려고합니다.
클라이언트가 json 배열을 가져오고 있지만 배열이 비어 있기 때문에 가까운 사이라고 느낍니다.

+0

당신이 getCustomData.Returns 를 시도 할 수() 및 방법 공공 IHttpActionResult GetCustomData()에서 일반 JSON 문자열을 반환? –

답변

1

반환 유형으로 string을 사용할 수 있습니다.

Public IHttpActionResult GetCustomData() 
{ 
    var query = (from o in Orders 
      select CustomerName = o.CustomerName, 
      LowerCount = o.OrderDetails.Where(f => f.Pieces >= 0 && f.Pieces <= 100).Count(), 
      MidCount = o.OrderDetails.Where(f => f.Pieces >= 101 && f.Pieces <= 200).Count(), 
      HighCount = o.OrderDetails.Where(f => f.Pieces >= 201).Count() 
      ); 

    return Ok(JsonConvert.SerializeObject(query)); 
} 

FunctionConfiguration :

FunctionConfiguration getCustomData = builder.EntityType<Order>().Collection.Function("GetCustomData"); 
getCustomData.Returns<string>();