(ASP .NET MVC4 WebApi -- OData 使用 與 實作$inlinecount)
(ASP .NET MVC4 WebApi -- OData 使用 與 實作$inlinecount(續) -- C# Model 接取$inlinecount 資料)
範例為建立一個API,把OData參數傳給資料來源Api,然後做簡單處理或直接回傳(資料來源Api開放使用OData)。
建立一個Api
//如果有$inlinecount就會是不同的格式,所以這邊回傳Object
public Object Get()
{
return "test";
}
取得所有OData參數
List<string> arrParams = Request.GetQueryNameValuePairs() //所有QueryString的Name、Value集合
.Where(x => x.Key.StartsWith("$")) //只取得開頭為$
.Select(x => string.Format("&{0}={1}", x.Key, Uri.EscapeDataString(x.Value))) //組回 &Name=Value
.ToList();
因為範例的資料來源API本身有指定參數,所以這邊會先把 & 加上,方便後面整理所有參數,請視個人情況調整加上的時機。判斷是否有設定$inlinecount=allpages
有的話就要用C# Model 接取$inlinecount 資料的共用Model去接資料,沒有就用一般方式即可。
if(arrParams.Select(x => x.ToLower()).Contains("&$inlinecount=allpages") == true)
Select出來轉小寫以後判斷是否包含"&$inlinecount=allpages",因為沒實際測試$filter大小寫是否有區別,所以沒有在取得QueryString的時候就轉。由組回 Name=Value 時前面有沒有加 & 來決定這邊要不要加。
組合資料來源Api的URL
string.Format("DefauleUrl?name1=val1&name2=val2{0}", string.Join("", arrParams));
string.Join要不要加 & 一樣由前面就決定了,串出來的Url請仔細確認參數部分的格式是不是正確的。下面是實際範例
public Object Get()
{
List<string> arrParams = Request.GetQueryNameValuePairs().Where(x => x.Key.StartsWith("$")).Select(x => string.Format("&{0}={1}", x.Key, Uri.EscapeDataString(x.Value))).ToList();
bool IsAllpages = false;
string strParams = string.Join("", arrParams);
string strUrl = string.Format("DefauleUrl?name1=val1&name2=val2{0}", string.Join("", arrParams));
List<ModelName> Models = new List<ModelName>();
ODataByApi<ModelName> odateModel = new ODataByApi<ModelName>();
if (arrParams.Select(x => x.ToLower()).Contains("&$inlinecount=allpages"))
{
odateModel = GetData<ODataByApi<ModelName>>(strParams);
Models = odateModel.Items.ToList();
IsAllpages = true;
}
else
{
Models = GetData<List<ModelName>>(strParams);
}
//資料處理
if (Models != null)
{
//To do....
}
//有$inlinecount=allpages,丟回ODataByAp後return
if (IsAllpages == true)
{
odateModel.Items = Models;
return odateModel;
}
//否則return List
return Models;
}
參考:
(ASP .NET MVC4 WebApi -- OData 使用 與 實作$inlinecount)
(ASP .NET MVC4 WebApi -- OData 使用 與 實作$inlinecount(續) -- C# Model 接取$inlinecount 資料)
沒有留言 :
張貼留言