«Fields.Include» требуется при определении пользовательских полей в выборе? - PullRequest
0 голосов
/ 28 марта 2012

Я использую официальный драйвер MongoDB C #

Итак, у меня есть этот код

MongoCollection<MyClass> collection = ...;
var cursor = collection.FindAll();
cursor.Fields = Fields.Include("LastModified", "Name");
foreach (var result in cursor.Select(y => new
    {
        y.Name,
        y.LastModified,
    }))

Я хочу знать, требуется ли cursor.Fields = Fields.Include("LastModified", "Name");, если эти поля защищаются как частьВыбрать.т. е. является ли поставщик linq для mongodb достаточно умным, чтобы оптимизировать запрос?

1 Ответ

0 голосов
/ 28 марта 2012

Ответ состоит из двух частей:

Во-первых, реализация LINQ в версии 1.4 драйвера C # не пытается ограничить поля, возвращаемые сервером.Весь документ всегда возвращается, даже если проекция позже использует только его часть.Мы планируем оптимизировать это в будущих выпусках, но это не так просто, как кажется.

Во-вторых, вы на самом деле не используете запрос LINQ, по крайней мере, не запрос LINQ to MongoDB.Когда ваш код написан, вы извлекаете всю коллекцию клиенту (это то, что делает FindAll), а затем используете выбор локально по полученным значениям.Подобный LINQ-запрос к MongoDB был бы написан так:

var query = from y in collection.AsQueryable<MyClass>()
            select new { y.Name, y.LastModified };
foreach (var result in query)
{
    // process result
}
...