MongoDB C#选择特定列

时间:2013-10-11 03:19:09

标签: mongodb mongodb-.net-driver mongodb-query

我知道MongoDb C#驱动程序不支持投影,所以我搜索了一下,发现许多人使用mongoCursor来执行此类查询,我只想选择特定字段,我的代码如下:

public T GetSingle<T>(Expression<Func<T, bool>> criteria,params Expression<Func<T, object>>[] fields) where T : class
{
    Collection = GetCollection<T>();
    return Collection.FindAs<T>(Query<T>.Where(criteria)).SetFields(Fields<T>.Include(fields)).SetLimit(1).SingleOrDefault();
} 

我为用户提供了自定义存储库:

public User GetByEmail(string mail, params Expression<Func<User, object>>[] fields)
{
    return GetSingle<User>(x=>x.Email==mail,fields);
}

这是用法:

_repository.GetByEmail(email, x=>x.Id,x=>x.DisplayName,x=>x.ProfilePicture)

但我得到参数中包含的字段,以及作为User类一部分的所有枚举,日期和布尔值,字符串中未包含在字段列表中的值为null,因此很好< / p>

enter image description here

我该怎么做才能避免这种情况?

1 个答案:

答案 0 :(得分:2)

通过使用SetFields,您可以指定通过电汇的内容。但是,在这种情况下,您仍然要求司机返回TUser类型的水合物。

现在,类似于说intenumbooleanvalue types,因此它们的值不能是null。所以这严格来说是一个C#-problem:这些属性根本没有值表明它们不存在。相反,它们采用默认值(例如falsebool,数字类型为0。另一方面,stringreference type,因此它可以为空。

策略

使属性可以为空您可以在模型中使用可空字段,例如:

class User {
    public bool? GetMailNotifications { get; set; }
}

这样,值类型可以具有其有效值之一或null。但是,这可能会使用起来很笨拙,因为每当您想要访问该属性时,您都必须进行null检查并使用myUser.GetMailNotifications.ValuemyUser.GetMailNotifications.GetValueOrDefault帮助程序。

只需添加字段这不会回答 的问题,但至少有三个很好的理由说明为什么包含它们是个好主意:

  1. 当传递User对象时,最好是对象处于有效状态。否则,你可能会将一个部分水合的对象传递给一个方法,该方法会进一步传递它,在某些时候,有人会尝试一个没有意义的操作,因为该对象是不完整的
  2. 使用起来比较容易
  3. 性能优势可以忽略不计,除非您嵌入了我建议不要使用的巨大阵列,而且这种情况并非如此。
  4. 所以问题是:你为什么要全力排除某些领域?