你自己處理OData查詢非常容易,你可以返回IEnumerable
,IList
,PageResults
或其他什麼。這裏有一個例子:
[HttpGet]
[ActionName("Example")]
public IEnumerable<Poco> GetExample(ODataQueryOptions<Poco> queryOptions)
{
//simulate an EF DbSet for the example
var data = new Poco[] {
new Poco() { id = 1, name = "one", type = "a" },
new Poco() { id = 2, name = "two", type = "b" },
new Poco() { id = 3, name = "three", type = "c" }
};
var t = new ODataValidationSettings() { MaxTop = 2 };
queryOptions.Validate(t);
var s = new ODataQuerySettings() { PageSize = 1 };
var results = queryOptions
.ApplyTo(data.AsQueryable(), s) as IEnumerable<Poco>;
return results;
}
public class Poco
{
public int id { get; set; }
public string name { get; set; }
public string type { get; set; }
}
謝謝你,因爲這是一個很好的例子!但是,這並不是我所要求的。我的OData服務不會直接訪問數據庫,因爲它位於DMZ中,並在域內代理對WCF服務的調用。因此,它返回的任何數據最終都將來自單獨的服務,而不是直接來自數據庫。我想要做的是限制在WCF服務中查詢的數據,而不是全部返回,然後過濾。因此,我希望過濾器,排序等參數轉到內部服務,在那裏過濾數據,然後將結果返回到管道。 –
@JamieNordmeyer技術上你可以在應用程序的任何層運行這段代碼。或者,您可以分解ODataQueryOptions類的各個部分並構建您自己的查詢。 $ top,$ skip等非常容易,當你試圖分解'$ filter'的時候會出現複雜情況。 – qujck
我打算看看這個。 :)我早些時候回覆之後想到了它;我還沒有時間去挖掘它。我會告訴你。 –