我正在使用 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))
然后解决此问题时,我收到以下错误
无法确定表达式的序列化信息: 。
编辑
我尝试在不使用 mongo db 的情况下实现这个基本案例,并且相同的查询工作正常。然后,我尝试使用 mongo C# 驱动程序进行测试,以将 .where 与 As 方法一起使用,这导致了相同的错误。
我找到了查询
queryable.Where(
it => (it.Property is Child && ((Child)it.Properties).Value.Value == "example"));
工作正常,想知道是否有办法从同一个 uri 将查询转换为这种形式,或者让 mongodb 的 C# 驱动程序将查询转换为这种形式?