2016-02-05 2 views
4

Я пытаюсь использовать драйвер версии MongoDB C# 2.2. Я пытаюсь использовать проекцию, поскольку я не хочу извлекать все элементы в документе. Я нашел один способ сделать это состоит в использовании оператора проекта наряду с находят оператора, что-то вроде этого:Проецирование с помощью AsQueryable в драйвере MongoDB C# 2.2

collection.Find(key => key.Index == 1).Project<MyClass>(Builders<MyClass>.Projection.Include(key => key.Name).Include(key => key.Index)). ToEnumerable(); 

Однако я заинтересован в использовании AsQueryable API вместе с тем, где оператор, что-то вроде этого:

collection.AsQueryable().Where(key => key.Index == 1); 

Возможно ли использовать проекцию в вышеуказанном случае? Если я использую оператор select, будет ли он иметь тот же эффект, что и проекция? Или все еще будут извлекать все элементы с сервера базы данных, а затем выбрать определенные элементы на сервере приложений?

ответ

5

Да, это возможно. Если добавить Select (Select(i => new { i.Name, i.Index})) для вашего запроса и вызов ToString метода в конце концов, вы увидите, что провайдер Linq генерирует трубопровод агрегации с двумя операциями (а $match и $project):

var query=collection.AsQueryable().Where(key => key.Index == 1).Select(k=>new {k.Name,k.Index}); 
var aggregate= query.ToString(); 

В sumary , да, a Select генерирует операцию $project.

О других вопросах, ваш запрос не будет выполнен до тех пор, пока вы вызовете метод, подобный ToList (который собирает результат вашего запроса в память) или когда вы перебираете результат.

+0

Можно ли использовать Исключенный синтаксис? – zicjin

Смежные вопросы