我知道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>
我该怎么做才能避免这种情况?
答案 0 :(得分:2)
通过使用SetFields
,您可以指定通过电汇的内容。但是,在这种情况下,您仍然要求司机返回T
,User
类型的水合物。
现在,类似于说int
,enum
和boolean
是value types,因此它们的值不能是null
。所以这严格来说是一个C#-problem:这些属性根本没有值表明它们不存在。相反,它们采用默认值(例如false
为bool
,数字类型为0
。另一方面,string
是reference type,因此它可以为空。
使属性可以为空您可以在模型中使用可空字段,例如:
class User {
public bool? GetMailNotifications { get; set; }
}
这样,值类型可以具有其有效值之一或null
。但是,这可能会使用起来很笨拙,因为每当您想要访问该属性时,您都必须进行null
检查并使用myUser.GetMailNotifications.Value
或myUser.GetMailNotifications.GetValueOrDefault
帮助程序。
只需添加字段这不会回答 的问题,但至少有三个很好的理由说明为什么包含它们是个好主意:
User
对象时,最好是对象处于有效状态。否则,你可能会将一个部分水合的对象传递给一个方法,该方法会进一步传递它,在某些时候,有人会尝试一个没有意义的操作,因为该对象是不完整的所以问题是:你为什么要全力排除某些领域?