odata是乙個非常靈活的restful api,如果要做出強大的查詢api,那麼odata就強烈推薦了。
odata的特點就是可以根據傳入引數動態生成entity framework的查詢,最終實現動態的sql的查詢。但是在專案有時我們並沒有採用entity framework,而是採用的nhibernate,那麼該怎麼用odata呢?
經過一段時間的google和研究,終於找到了乙個好的方案。
在odata api查詢時,使用者前端是url跟引數,但是在伺服器端,我們是接收到的是乙個odataqueryoptions物件,其實我們需要做的就是把這個物件進行解析,生成nhibernate能夠理解的查詢形式,比如hql。網上找到微軟官方已經寫了這麼個轉換方法,主要是對odataqueryoptions物件下的filter和orderby進行轉換,另外兩個引數top和skip很簡單,就是乙個整數。
public
static
string tohql(
this odataqueryoptions query,
outint top,
outint skip)
if(query.orderby!=
null)
top = query.top?.value ??
0; skip = query.skip?.value ??
0; return querystring;
}
odataqueryoptions轉換為hql的專案在這裡:
filter和orderby屬性都會被轉換成hql,然後我們就需要進行nhibernate的查詢了。
public queryresultfindbypaging(
string hql,
int top,
int skip)
querys.add(query);
if (paging)
var queryresults = querys.list();
var result =
new queryresult();
result.totalcount = paging
? convert.toint32( ((ilist) queryresults[
1])[
0])
: ((ilist) queryresults[
0]).count;
result.resultset = ((ilist) queryresults[
0]).cast().tolist();
return result;
}
對於一般的分頁查詢來說,我們應該會有兩個查詢,乙個是查詢滿足條件的資料總條數,另乙個是返回當前頁的資料集。但是似乎odata並不支援返回這樣的資料型別,odata支援的是entity的list,如果我們重新定義了乙個物件queryresult:
[datacontract]
public
class queryresult
[datamember]
public ilistresultset
public queryresult()
public queryresult(
int count, ilistlist)
}
然後在controller中返回queryresult,那麼系統就會報406的錯誤。其實系統給我們提供了乙個專門分頁返回的物件system.web.http.odata.pageresult,我們可以將service返回的queryresult封裝成pageresult再返回即可。
pageresult裡面有個nextpage的uri引數,我們可以傳null。
OData 協議介紹和使用
odata 協議 odata乙個開放的協議以一種簡單規範的方式來建立和消費可查詢和可協作的restful apis。查詢,分頁,排序在get的request請求中以鍵值對的方式傳遞。1 offset,limit 完成分頁查詢 example.com?offset 0 偏移量為0。example.co...
讓Hyper V和VMware共存
hyper v和vmware不能在一台電腦中同時執行,是因為兩者都是基於 cpu 等底層硬體的 hypervisor 機制來實現的,而他們必須獨佔管理 hypervisor.以管理員身份開啟cmd 1.執行 bcdedit copy d windows 8 關閉 hyper v 命令,隨後會提示已經...
如何讓Visual Studio和web標準聯姻
前言 這篇文章可能會引起 網頁設計者 的不安,因為可能會讓他們產生 我必須要學習枯燥的 的誤解 這篇文章也可能會引起 程式設計師 的不安,因為可能會讓他們產生 我必須學習繁瑣的網頁設計 的誤解 這篇文章也可能會引起 網頁初學者 的不安,因為可能會讓他們產生 我必須同時學習枯燥的 和繁瑣的網頁設計 的...