繁体   English   中英

使用C#LINQ驱动程序比较Mongodb中的日期

[英]Comparing dates in Mongodb with C# LINQ driver

我有一个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驱动程序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:{document}。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();

创建ac#属性以将字符串解析为日期,然后在过滤器中引用该字符串将不起作用,因为转换不是在数据库范围内发生,而是在c#代码中进行。 如果不能将日期存储为DateTime(MongoDb ISODate()),则可以查看Project()以从字符串中投影转换后的日期,然后执行查询

最终,我找到了一种针对日期字段使用自定义序列化程序的解决方案。 这就是它的样子。

我的课:

[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;
    }
}

希望它可以帮助某人。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM