Я хочу выставить IQueryable<TPublic>
через WebApi, который может запрашиваться произвольным запросом потребителем API. Сохраненные объекты имеют тип TInternal
, поэтому я использую Queryable Extensions AutoMapper для отображения IQueryable<TInternal> -> IQueryable<TPublic>
. Это работает, и я могу использовать Одата 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>();
}
Любые предложения о том, как сделать это возможным, не требуя от меня полного обратного сопоставления фильтров?