比较Mongodb与c# LINQ驱动程序中的日期
本文关键字:日期 驱动程序 LINQ Mongodb 比较 | 更新日期: 2023-09-27 18:16:24
我有一个MongoDB集合,其中包含一个表示日期的字符串字段。在我的c#应用程序中,我将结果映射到一个带有聚合字段的类,该字段将该字符串转换为DateTime对象
[BsonIgnoreExtraElements]
public class Tweet
{
public ObjectId Id { get; set; }
[BsonElement("text")]
public string Texto { get; set; }
[BsonElement("created_at")]
public string Fecha { get; set; }
public DateTime FechaConvertida
{
get
{
var formato = "ddd MMM dd HH:mm:ss zzzz yyyy"; //'Sun Oct 23 19:42:04 +0000 2016'
var enUS = new CultureInfo("en-US");
var fechaConvertida = DateTime.ParseExact(this.Fecha, formato, enUS, DateTimeStyles.None);
return fechaConvertida;
}
}
}
然后在我的api上,我在两个日期之间进行查询过滤元素(使用'CSharp Driver LINQ')
public IEnumerable<Tweet> GetTweetsDePeriodo(string nombreColeccion, int dias)
{
var hoy = DateTime.Today;
var fechaInicial = hoy.AddDays(-dias);
var coleccion = _db.GetCollection<Tweet>(nombreColeccion).AsQueryable<Tweet>();
var tweetsFiltrados = (from c in coleccion
where c.FechaConvertida >= fechaInicial
select c
).ToList();
return coleccion;
}
然后我得到以下错误:*在处理请求时发生未处理的异常。InvalidOperationException:}{文档。不支持FechaConvertida
任何想法?提前感谢,
最后,我找到了一个使用自定义序列化器的Date字段的解决方案。这就是它的样子。
我的类:
[BsonIgnoreExtraElements]
public class Tweet
{
public ObjectId Id { get; set; }
[BsonElement("text")]
public string Texto { get; set; }
[BsonElement("created_at")]
[BsonSerializer(typeof(FechaTweetsSerializer))]
public DateTime Fecha { get; set; }
}
和自定义序列化器:
public class FechaTweetsSerializer : SerializerBase<DateTime>
{
public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, DateTime value)
{
context.Writer.WriteString(value.ToString(CultureInfo.InvariantCulture));
}
public override DateTime Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
{
var fecha = context.Reader.ReadString();
return ConvertirFecha(fecha);
}
private DateTime ConvertirFecha(string fechaFormatoTwitter)
{
var formato = "ddd MMM dd HH:mm:ss zzzz yyyy"; //'Sun Oct 23 19:42:04 +0000 2016'
var enUS = new CultureInfo("en-US");
var fechaConvertida = DateTime.ParseExact(fechaFormatoTwitter, formato, enUS, DateTimeStyles.None);
return fechaConvertida;
}
}
希望对大家有所帮助。
正如在评论中已经提到的,如果您要在模型中将属性声明为Datetime
[BsonElement("created_at")]
public DateTime Fecha { get; set; }
那就不会有问题了。您还可以使用BsonRepresentation修饰您的属性,以确保正确的(反)序列化发生
[BsonRepresentation(BsonType.DateTime)]
[BsonElement("created_at")]
public DateTime Fecha { get; set; }
执行查找,一个简单的解决方案是
var coleccion = _db.GetCollection<Tweet>(nombreColeccion).Find(x => x.Fecha >= fechaInicial).ToList();
创建一个c#属性来解析字符串作为日期,然后在你的过滤器中引用它是行不通的,因为转换不是发生在数据库范围内,而是发生在c#代码中。如果将日期存储为DateTime (MongoDb ISODate())不是一个选项,您可以查看Project()以从字符串投射转换后的日期,然后执行查询