2013-07-05 61 views
0

我正在使用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#的驅動程序爲查詢到這個轉換形成?

+0

你有沒有解決過這個問題? –

+0

不,我們編寫了自己的模型,以便我們只查詢子類。我們將查詢'http://...Child?$ filter = Value/Value eq'example'' – Andrew

回答

1

你可以試試這個代替,

var filteredContainers = queryOptions.ApplyTo(containers, 
    new ODataQuerySettings 
    { 
     EnableConstantParameterization = false, 
     HandleNullPropagation = HandleNullPropagationOption.False 
    }); 

+0

這給了我錯誤「無法確定表達式的序列化信息: $ it.Property.Value.Value和一個IQueryable表達式的值(MongoDB.Driver.Linq.MongoQueryable'1 [NS.Container])。Where($ it =>(($ it.Property As Child).Value.Value ==「example」)) – Andrew