如何通过MongoDB C#驱动表达式投影获取可空DateTime值?
解决MongoDB投影字典不存在键时返回DateTime? null的问题
问题分析
当使用MongoDB驱动的投影表达式访问IReadOnlyDictionary<string, DateTime>中不存在的键时,驱动会返回DateTime.MinValue(值类型的默认值),而非期望的DateTime?类型null。我们需要在不修改字典值类型的前提下,调整投影逻辑实现需求。
解决方案
在投影表达式中加入键存在性判断,通过三元运算符将结果转换为DateTime?类型:
var projection = Builders<Bar>.Projection.Expression(x => x.Foo.Values.ContainsKey("key") ? (DateTime?)x.Foo.Values["key"] : null );
原理说明
x.Foo.Values.ContainsKey("key"):MongoDB驱动会将该LINQ方法转换为MongoDB的$exists查询逻辑,判断目标键是否存在于字典对应的文档字段中。- 键存在时,将
DateTime值显式转换为DateTime?类型;键不存在时直接返回null,最终投影结果类型即为DateTime?。
效果验证
针对提供的示例文档:
- 含值文档:投影后返回对应时间的
DateTime?实例 - 空文档:投影后返回
null
内容的提问来源于stack exchange,提问作者Ilya Chernomordik
相关产品推荐
相关产品推荐

