2016-10-13 31 views
1

我試圖從MongoDB的集合與日期過濾器讀取*表達的序列化信息*(僅日期,時間應該被忽略):無法確定使用.Date

var filterDefinition = Builders<SomeClass>.Filter.Eq(p => p.SomeDateTimeProperty.Date, DateTime.Now.Date); 
using (var cursor = await _someCollection.FindAsync(filterDefinition)) 
{ ... } 

SomeClass和在SomeDateTimeProperty屬性是這樣的:

[BsonIgnoreExtraElements] 
[Serializable] 
public class ReportConfiguration 
{ 
    ... 
    public DateTime SomeDateTimeProperty { get; set; } 
    ... 
} 

試圖.FindAsync()時,代碼引發InvalidOperationException

類型的異常「System.InvalidOperationException」發生在 MongoDB.Driver.dll但在用戶代碼中沒有處理的其他信息 :無法確定p的串行化信息 => p.SomeDateTimeProperty.Date

如果我刪除過濾器中的.Date部分(p.SomeDateTimeProperty.Date,DateTime.Now.Date),一切正常,但無論hh \ mm如何,我都需要一個yyyy \ mm \ dd比較。

堆棧跟蹤說:

at MongoDB.Driver.ExpressionFieldDefinition`2.Render(IBsonSerializer`1 documentSerializer, IBsonSerializerRegistry serializerRegistry) 
at MongoDB.Driver.SimpleFilterDefinition`2.Render(IBsonSerializer`1 documentSerializer, IBsonSerializerRegistry serializerRegistry) 
at MongoDB.Driver.MongoCollectionImpl`1.CreateFindOperation[TProjection](FilterDefinition`1 filter, FindOptions`2 options) 
at MongoDB.Driver.MongoCollectionImpl`1.FindAsync[TProjection](FilterDefinition`1 filter, FindOptions`2 options, CancellationToken cancellationToken) 
at MongoDB.Driver.IMongoCollectionExtensions.FindAsync[TDocument](IMongoCollection`1 collection, FilterDefinition`1 filter, FindOptions`2 options, CancellationToken cancellationToken) 
at [...] 

可能是什麼問題?

+0

您是否嘗試過沒有.Date部分? – Mahdi

+0

是的,刪除.Date部分可以防止出現異常,我在問題中添加了這個說明 - 謝謝! –

回答

0

驅動程序不知道如何序列化兩個日期之間的Eq表達式。

嘗試做的ToString()這兩個日期部分:

var filterDefinition = Builders<SomeClass>.Filter.Eq(p => p.SomeDateTimeProperty.Date.ToString(), DateTime.Now.Date.ToString()); 

如果還是不行,請嘗試這樣的:

var date = DateTime.Now.Date.ToString();  
var docs = _someCollection.asQueryable().Where(p => p.SomeDateTimeProperty.Date.ToString() == date); 
+0

嘗試了第一個,我得到了相同的InvalidOperationException。對於第二個,我仍然得到: '在MongoDB.Driver.dll中發生了類型'System.InvalidOperationException'的異常,但未在用戶代碼中處理。附加信息:不支持{document} {SomeDateTimeProperty} .Date.ToString()' –

1

你有沒有想過使用LT使用條款之間的和Gt運營商

var b = Builders<SomeClass>.Filter; 
var date = DateTime.UtcNow.Date; 
var filter = b.And(
     b.Gte(x => x.SomeDateTimeProperty, date), 
     b.Lt(x => x.SomeDateTimeProperty, date.AddDays(1)) 
     ); 
... 
+0

是的,這是我接觸到的當前解決方案,它工作得很好,這是一個很好和清晰的解決方法。但我很好奇爲什麼第一種方法不起作用... –

+1

我認爲是因爲.Date是DateTime上的ac#函數,當您嘗試將它應用於Mongodb模型屬性上的屬性時,MongoDb驅動程序無法解釋。在使用MongoDb c#驅動程序時,您會發現很多這種情況,特別是在使用Linq時 – pieperu