我正在使用odata並試圖過濾關於子類屬性的查詢。無法使用Web Api查詢OData中的子屬性
我正在使用MongoDb存儲一系列對象,並且想要使用OData查詢這些對象。這些對象是從xml自動生成的,因此存在一些煩人的繼承,下面是基本的對象場景。
public class Container {
public Parent Property {get; set;}
}
public class Parent {}
public class Child : Parent {
public StringWrapper Value {get; set;}
}
public class StringWrapper {
public string Value {get; set;}
}
所以我所做的容器放入一個實體,由具有編碼控制器:
public ContainerController : ODataController {
public PageResult<Container> Get(ODataQueryOptions<Container> queryOptions) {
IQueryable<Container> containers = mongoRepo.All();
var filteredContainers = queryOptions.ApplyTo(containers)
as IQueryable<Container>;
return new PageResult<Container>(filteredContainers,
Request.GetNextPageLink(),
Request.GetInlineCount());
}
}
我再與URI查詢此:
http://...Container?$filter=Property/NS.Child/Value/Value eq 'example'
如果我在應用查詢選項後拋出斷點並查看IQueryable.Expression得出結果:
value(MongoDB.Driver.Linq.MongoQueryable`1[NS.Container])
.Where($it => (IIF((IIF((($it.Property As Child) == null), null, ($it.Property As Child).Value) == null), null, ($it.Property As Child).Value.Value) == value(System.Web.Http.OData.Query.Expressions.LinqParameterContainer+TypedLinqParameterContainer`1[System.String]).TypedProperty))
解決此問題後,出現以下錯誤
無法確定表達式的序列化信息:。
編輯
我試着不使用蒙戈DB和相同的查詢工作正常實施這一基本情況。然後我使用mongo C#驅動程序進行了測試,結果與As方法一起使用.where導致了相同的錯誤。
我
queryable.Where(
it => (it.Property is Child && ((Child)it.Properties).Value.Value == "example"));
作品正確地找到查詢,並想知道如果有一種方法可以從相同的URI得到查詢到這個形式,或者獲得MongoDB的C#的驅動程序爲查詢到這個轉換形成?
你有沒有解決過這個問題? –
不,我們編寫了自己的模型,以便我們只查詢子類。我們將查詢'http://...Child?$ filter = Value/Value eq'example'' – Andrew