2016-11-04 24 views
0

私は日付を表す文字列フィールドを持つMongoDBコレクションを持っています。私のC#のアプリでは、私は 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に私は2つの日付の間のクエリフィルタエレメントを作る

DateTimeオブジェクトにその文字列を変換する集計フィールドを持つクラスに結果をマップ(「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はサポートされていません

ご存知ですか?あなたはそれが問題になることはありません日時

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

としてあなたのモデルにあなたの財産を宣言した場合、事前に おかげで、

+0

fechaInicialをvarではなくDateTimeとして宣言できますか? –

+0

Tweetデータオブジェクトを私たちに教えてもらえますか? – Dudemanword

+0

@viveknuna私はそれを試しましたが、何も変えていません。とにかくありがとう、 – Pedraz

答えて

0

最後に、 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; 
    } 
} 

は、それが誰かに役立ちます願っています。

0

としては、コメントですでに述べました。また

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

たまたま正しい(デ)serielizationを確保するためにBsonRepresentationを使用してあなたの財産を飾ることができ、あなたのルックアップを実行するシンプルなソリューションを解析するのAC#のプロパティを作成

var coleccion = _db.GetCollection<Tweet>(nombreColeccion).Find(x => x.Fecha >= fechaInicial).ToList(); 

だろうデータベースのスコープではなく、C#コードで変換が行われていないため、フィルタでその文字列を参照することはできません。 DateTimeとして日付を格納するオプション(MongoDb ISODate())はオプションではない場合は、Project()を調べて文字列から変換した日付を投影してからクエリを実行することができます。

+0

フィールドをDateTimeとして宣言し、 'BsonRepresentation'タグを追加しようとしましたが、例外がスローされます。 ** FormatException:Stringが有効なDateTimeとして認識されませんでした** 問題は、 BDは奇妙な日時フォーマットを持っています: 'Sun Oct 23 19:42:04 +0000 2016'。 「オンザフライ」でシリアル化する方法をご存知ですか?たぶんカスタムBsonシリアライザですか?ご協力いただきありがとうございます – Pedraz