2016-11-04 17 views
0

我有一個MongoDB的集合與代表日期的字符串場。在我的C#應用​​程序我映射該字符串轉換爲DateTime對象MongoDB中比較日期與C#LINQ司機

[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

任何想法? 由於提前,

+0

你可以聲明fechaInicial的日期時間,而不是變種。 –

+0

你能告訴我們你的Tweet數據對象嗎? – Dudemanword

+0

@viveknuna我試過了,但沒有改變任何東西。無論如何, – Pedraz

回答

0

最後,我找到了解決方案使用日期字段的自定義序列化程序。這是它的樣子。

我的類:

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

希望它可以幫助別人。

0

正如評論已經提到的,如果你在你的模型申報你的財產爲datetime

[BsonElement("created_at")] 
public DateTime Fecha { get; set; } 

那麼它不應該是一個問題。您也可以裝飾用BsonRepresentation你的財產,以保證正確的(de)serielization發生

[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#代碼中發生。如果將日期存儲爲日期時間(MongoDb ISODate())不是一個選項,則可以查看Project()以便從字符串中投影已轉換的日期,然後執行查詢。

+0

我試圖將該字段聲明爲DateTime並添加了'BsonRepresentation'標記,但它引發了一個異常: ** FormatException:字符串未被識別爲有效的DateTime ** 問題是存儲在BD有一個奇怪的日期時間格式:'Sun Oct 23 19:42:04 +0000 2016'。 你知道一個序列化'即時'的方法嗎?也許是一個自定義Bson序列化程序?謝謝你的幫助 – Pedraz