2014-04-26 106 views
3

我有web api odata服務,我需要返回一些數據,這些數據是從實體變扁平的LINQ查詢中生成的。例如,我有一個訂單列表,我已經在數據服務端使用LINQ來生成新的屬性,以便我想返回計數介於0和100之間的訂單數,然後計算另一個計數介於101和200等。這裏是一個簡化的例子。
.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); 
} 

在我WebApiConfig我的代碼FunctionConfiguration類似以下內容:

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

的網址讓我正確地調用函數,但返回的JSON包含空數組。例如:如果有6條記錄要返回,那麼Json裏面會有6個空[]。

我也嘗試返回Newtonsoft.Json.Linq.JObject並使用Newtonsoft將LINQ序列化爲Json,但後來我得到一個運行時錯誤。
「複雜類型'JToken'通過屬性'Parent'引用自身,複雜類型的遞歸循環是不允許的。」

我知道我可以創建自定義類來解決這個問題,但必須有一些更簡單的方法將通用Json發送到客戶端,以便客戶端可以展開和讀取數據。
我也知道我可以將整個訂單/訂單詳細信息發送給客戶端,以便客戶端可以對數據進行「計數」,但我希望將來自Web服務的有效負載減小。
我覺得我很近,因爲客戶端正在取回一個json數組,但數組是空的。

+0

你可以嘗試getCustomData.Returns ()和方法公開IHttpActionResult GetCustomData()返回通用的JSON字符串? –

回答

1

您可以使用字符串作爲返回類型。

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>();