在select中定义自定义字段时是否需要“Fields.Include”?

时间:2012-03-28 01:56:35

标签: c# .net mongodb mongodb-.net-driver

我正在使用官方的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,
    }))

我想知道如果这些字段作为select的一部分被定义,是否需要cursor.Fields = Fields.Include("LastModified", "Name");。即mongodb的linq提供商是否足以优化查询?

1 个答案:

答案 0 :(得分:0)

答案分为两部分:

首先,1.4版本的C#驱动程序中的LINQ实现不会尝试限制从服务器返回的字段。即使投影稍后仅使用其中的一部分,也始终返回整个文档。我们计划在未来版本中对此进行优化,但这并不像听起来那么容易。

其次,您实际上并没有使用LINQ查询,至少不是LINQ to MongoDB查询。编写代码时,您将整个集合提取到客户端(这就是FindAll所做的),然后针对检索到的值使用Select local。针对MongoDB的类似LINQ查询将编写如下:

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