Оба делают почти одинаково.
LINQ API - это оболочка поверх Collection API.
Из краткого изучения источников mongo-csharp-driver я могу видеть, что версия LINQ вызывает либо Collection.FindAs (...) , либо Collection.Distinct (...) .Он строит IMongoQuery
, переданный в параметре query
, на основе выражения LINQ.Для этого он использует API построителя запросов (класс Query ), такой как Query.EQ
Что лучше?
Это зависит.
- Если в коде C # есть типы, представляющие структуру документов в базе данных, то вы, вероятно, выиграете от использования LINQ API.Вы выиграете от строгой типизации, лучшей читабельности и не пропустите переименованный идентификатор, имя которого было передано в виде строки.
- Если у вас динамическая структура данных, которая не имеет конкретного представления в коде (выиметь какие-то метаданные о документе, но не
class
, явно содержащий свойства документа).В таком случае использование LINQ было бы проблемой, а необработанный API-интерфейс Collection был бы лучшим выбором.
Фильтры LINQ на основе всей коллекции?Прежде чем я получу всю коллекцию, а затем она фильтрует?Или перед фильтрами, и это дает мне уже отфильтрованную коллекцию?
Поскольку LINQ API реализует IQueryable
, а не только IEnumeable
, все перечисляемые методы (такие как Where
или OrderBy
)на самом деле не вызывается, а переводится во время компиляции в код, который создает деревья выражений.Во время выполнения деревья выражений создаются и передаются базовому поставщику запросов (в данном случае реализуемому MongoDB Driver)Поставщик запросов преобразует деревья выражений в обычные запросы MongoDB и выполняет их через обычный API MongoDB.
См. Как использовать деревья выражений для построения динамических запросов для получения более подробной информации.
Таким образом, запрос фактически выполняется в базе данных, и только обработанные (отфильтрованные, упорядоченные или спроецированные) результаты возвращаются в приложение.
Тем не менее, использование LINQ API подразумевает некоторое снижение производительности, поскольку помимо выполнения запроса LINQ API также:
- создает деревья выражений для передачи их поставщику запросов
- посещает деревья выражений, чтобы перевести их в собственный запрос
Во многих случаях эти издержки пренебрежимо малы, но зависят от ваших требований.