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() для этого.

См. https://mongodb.github.io/mongo-csharp-driver/2.4/apidocs/html/M_MongoDB_Driver_Linq_LinqExtensions_Inject__1.htm

В приведенном примере кода (с небольшими исправлениями) это будет:

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();
Другие вопросы по тегам