Ответ 1
поскольку, насколько я понимаю, он отфильтровывает результат в где linq сначала получает все предметы в коллекции и затем фильтрует результат
Нет, нет и нет. Он фильтрует все на уровне базы данных.
Второй вариант не является родным способом построения запроса mongodb. По-прежнему одна и та же оболочка просто создает реальный собственный запрос mongod (например {"a": 1, "b": 2 }
).
Первый запрос использует деревья выражений для построения запроса mongo. Во-вторых, используйте рефлексию для построения того же запроса. Как я знаю, деревья выражений должны быть быстрее (здесь в первой статье, которую я нашел). Во всяком случае, я не думаю, что разница в производительности важна. Так что просто используйте то, что вам больше нравится.
Что касается меня, я использую linq для большинства запросов, и некоторые разработчики даже не знают много о монго, но черная сторона здесь заключается в том, что вы действительно можете не понимать, какой запрос он может построить для вас. (например, такая же ситуация с linq для sql). Но вы все равно можете регистрировать все собственные запросы, просматривать их и находить места для оптимизации, изменения. Для сложных запросов я обычно использую второй подход.