Aşağıdaki yöntemle çalışan (basitleştirilmiş) ODataController
var.Nasıl Yapılır ODataQueryOptions
public class MyTypeController : ODataController
{
[HttpGet]
[EnableQuery]
[ODataRoute("myTypes")]
public IQueryable<MyType> GetMyTypes(ODataQueryOptions<MyType> options)
{
return _repo.myResultsAsQueryable();
}
}
ben sunucudan bu yöntemi çağırmak için muktedir ve ben bir
ODataQueryContext
gerektiren bir
ODataQueryOptions
örneğini gerekir bunu yapmak istiyoruz
.
Bunun nasıl yapılacağına dair örnekler vardır (Örn. here ve here) ancak bunların tümü OData'nın önceki bir sürümüne başvuruyor gibi görünüyor. Şu anda ODataQueryContext yapıcısı, bulabildiğim herhangi bir örnekte ele alınmayan üçüncü bir bağımsız değişken (ODataPath
yol) gerektirir.
Düzenleme: @snow_FFFFFF, Burada bazı bağlam var ... Ben sadece bir HttpClient aracılığıyla OData bitiş noktası tüketebilir ama dediğiniz gibi doğrudan IQueryable ile etkileşim istiyorum biliyoruz.
Sorun şu ki üzerinde çalıştığım uygulama, kullanıcıların başka kullanıcılar tarafından kaydedilip daha sonra geri çağrılabilen filtreler (gelişmiş arama motoru gibi) oluşturmasına olanak veriyor. Bir JS istemcisinden, süzgeci yalnızca kimliğe göre ararlar ve sorgu dizesine uygulanan süzgeçle OData bitiş noktasına karşı bir sorgu yayınlarlar. Bu, istemci tarafında çok iyi çalışır, ancak sunucu tarafında da benzer bir şey yapabilmeyi isterim.
Yapmak istediğim şey budur ancak ODataPath argümanını nasıl oluşturabilirim?
public IQueryable<MyType> FilterMyTypes(int filterID)
{
// lookup filter by filterID from db...
filter = "$filter=Status eq 1"; // for example...
ODataPath path = // but how can I get the path!!!
new ODataQueryContext(edmModel, typeof(MyType), path);
var uri = new HttpRequestMessage(HttpMethod.Get, "http://localhost:56339/mytypes?" + filter);
var opts = new ODataQueryOptions<MyType>(ctx, uri);
var results = new MyTypeController().GetMyTypes(opts);
}
Bunun başka uygulama olarak aşağıda dinamik gruplama desteklemek olacaktır:
[HttpGet]
[Route("myTypes/{filterID:int}/groupby/{groupByFieldName}")]
public IHttpActionResult GroupMyTypes(int filterID, string groupByFieldName)
{
// For example: get all Active MyTypes and group by AssignedToUserID...
// Get the results of the filter as IQueryable...
var results = FilterMyTypes(filterID);
// group on groupByFieldName
var grouped = results.GroupBy(x => GetPropertyValue(x,groupByFieldName));
// select the groupByFieldName and the count
var transformedResults = grouped.Select(g => new { g.Key, Count = g.Count() });
return Ok(transformedResults);
}
http://github.com/OData/WebApi adresinde, başvurabileceğiniz birçok test vakası var. Örneğin, ODataQueryContext, bakın: https://github.com/OData/WebApi/blob/master/OData/test/UnitTest/System.Web.OData.Test/OData/Query/ODataQueryContextTests.cs#L181- L200 –
Teşekkürler Sam, Bunu deneyeceğim .. Açık kaynak kodlu MS için kullanılmamış ... –
Sam. Harikasın! Bunu bir cevaba koyarsan kabul edebilirim. Çok teşekkürler. Bir çekicilik gibi çalıştı. –