C# 如何只按年份过滤?

C# 如何只按年份过滤?,c#,mongodb,C#,Mongodb,我想查找与给定年份匹配的文档 我正在使用MongoDb.Driver,目前我需要这个库的解决方案 int年=2019年; var filter=Builders.filter.Eq(x=>x.DateOfCreation.Year,Year); var response=await Collection.Find(filter.FirstOrDefaultAsync(); 异常显示:“无法确定x=>x.DateOfCreation.Year的序列化信息。” 我希望输出为一个文档,该文档的年份等

我想查找与给定年份匹配的文档

我正在使用MongoDb.Driver,目前我需要这个库的解决方案

int年=2019年;
var filter=Builders.filter.Eq(x=>x.DateOfCreation.Year,Year);
var response=await Collection.Find(filter.FirstOrDefaultAsync();
异常显示:“无法确定x=>x.DateOfCreation.Year的序列化信息。”
我希望输出为一个文档,该文档的年份等于我的变量,无论日期的其他部分是什么,您都必须按范围搜索:

int year = 2019;
DateTime startDate = new DateTime(year, 1, 1);
DateTime endDate = new DateTime(year + 1, 1, 1);
var filter = Builders<CubesDataMdb>.Filter.Gte(x => x.DateOfCreation, startDate)
            & Builders<CubesDataMdb>.Filter.Lt(x => x.DateOfCreation, endDate);
var response = await Collection.Find(filter).FirstOrDefaultAsync();
int年=2019年;
DateTime startDate=新的日期时间(年,1,1);
DateTime endDate=新的日期时间(年份+1,1,1);
var filter=Builders.filter.Gte(x=>x.DateOfCreation,startDate)
&Lt(x=>x.DateOfCreation,endDate);
var response=await Collection.Find(filter.FirstOrDefaultAsync();

因此,我们在这里确定了两个日期:
2019/01/01
2020/01/01
。然后,我们可以搜索日期大于或等于
2091/01/01
和小于
2020/01/01

的所有记录,因为已经回答了这个问题。我将提供一种替代方法供将来参考(如果有人需要)

首先,该问题无法确定x=>x.DateOfCreation.Year的序列化信息

出现此错误的原因是
c#
驱动程序正在翻译给定的linq语句:

int year = 2019;
var filter = Builders<CubesDataMdb>.Filter.Eq(x => x.DateOfCreation.Year, year);
var response = await Collection.Find(filter).FirstOrDefaultAsync();
因此,Mongodb c#驱动程序无法将其映射到任何字段,因为类
CubesDataMdb
或数据库中存储的任何文档中都不存在字段
{document}{DateOfCreation}.Year
(ps更简单的解释是,
MongoDB
不支持
field.Year
的linq转换语法)

因此,除了提供的答案之外,还有另一种方法

聚合:

使用与模型
CubesDataMdb
具有相同属性的
ViewModel

public int Year { get; set; }
然后,通过使用
$year
从对象
DateOfCreation
中提取年份部分(假设
DateOfCreation
具有mongo日期而非字符串日期),构建一个要在聚合管道中使用的
$addFields
阶段,如下所示:


DateOfCreation
a
string
在您的数据库中,如果这是正确的,那么您无法从
string date
中获取
Year
值。这是日期格式。我已经发布了一个响应。希望这能澄清
DateOfCreation.Year
不起作用的原因。这对我来说很有效!感谢您的帮助!谢谢
public int Year { get; set; }
BsonDocument expressionString = new BsonDocument(new List<BsonElement>() {
    new BsonElement("Year", new BsonDocument(new BsonElement("$year", "$DateOfCreation"))),
});
BsonDocument addFieldsStageMongo = new BsonDocument(new BsonElement("$addFields", expressionMongo));
//adding the stage to the aggrigation pipeline
var response = await Collection
              .Aggregate()
              .AppendStage<BsonDocument>(addFieldsStageMongo)
              .Match(m=>m.Year == year)//using the filter on the newly added field of pipeline
              .FirstOrDefaultAsync();
db.Collection.aggregate([
{$addFields:{
    Year:{$year:"$DateOfCreation"}
}},
{
    $match:{
        "Year":2019
    }
}
])