我想通过WebApi公开IQueryable<TPublic>
,API使用者可以通过任意查询来查询。存储的对象的类型为TInternal
,因此我正在使用AutoMapper's Queryable Extensions来映射IQueryable<TInternal> -> IQueryable<TPublic>
。这行得通,我可以使用Odata's EnableQuery
进行过滤/分页等等。
但是,MongoDB仅在使用聚合框架进行查询时在匹配后完成投影时才使用索引。由于我的设置,情况总是如此,并且不会使用任何索引(直到Mongo实现链接到Jira的票证)。
要实际使用索引,可能需要我将匹配项移到投影之前。但是,过滤器是在通过TPublic
公开的字段上定义的,而不是在TInternal
上定义的。这不是小事,因为投影可能比重命名某些字段和隐藏其他字段更高级。
不使用索引的示例查询:
db.User.aggregate([
$project: { UserName: "uname", Email: "email" },
$match: { UserName: "Bouke" }
])
不使用索引的示例查询:
db.User.aggregate([
$match: { uname: "Bouke" },
$project: { UserName: "uname", Email: "email" }
])
示例操作:
[EnableQuery(...)]
public IQueryable<User>()
{
return UserCollection.AsQueryable().ProjectTo<User>();
}
关于如何使之成为可能的任何建议,而无需我编写过滤器的完整反向映射?