MongoDB FilterDefinition и IQueryable в C#
У меня есть следующие пространственные FilterDefinition
:
var filter = Builders<MyDocument>
.Filter
.Near(x => x.Point, point, 1000);
Есть ли способ включить это в IQueryable
выражение?
Например, у меня может быть следующий оператор LINQ. Как я могу включить вышеуказанное условие? Из того, что я вижу, LINQ не поддерживает пространственные запросы.
return Database
.GetCollection<Places>("Places")
.AsQueryable()
.Where(x => x.StartDate.Date <= date)
.Where(x => x.EndDate.Date >= date)
.Where(x => keys.Contains(selectedKeys))
.ToList();
Я использую новые библиотеки 2.2.2.
1 ответ
В проекте jira драйверов.NET есть запрос на добавление: https://jira.mongodb.org/browse/CSHARP-1445. Итак, ответ на данный момент нет, но, надеюсь, скоро.
Однако в FilterDefinitionBuilder есть метод "Где" ( https://github.com/mongodb/mongo-csharp-driver/blob/master/src/MongoDB.Driver/FilterDefinitionBuilder.cs#L1286), который позволяет включить предикат LINQ в обычные запросы поиска / агрегации.
Начиная с версии 2.4 вы можете использовать Inject()
для этого.
В приведенном примере кода (с небольшими исправлениями) это будет:
var filter = Builders<Places>
.Filter
.Near(x => x.Point, point, 1000);
return Database
.GetCollection<Places>("Places")
.AsQueryable()
.Where(x => x.StartDate.Date <= date)
.Where(x => x.EndDate.Date >= date)
.Where(x => keys.Contains(selectedKeys))
.Where(x => filter.Inject())
.ToList();