2016-10-13 8 views
1

Я пытаюсь читать из коллекции MongoDB с Date фильтром (только дата, время должно быть проигнорировано):Невозможно определить информацию о сериализации для * выражение * с помощью .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; } 
    ... 
} 

код бросает InvalidOperationException при попытке .FindAsync():

Исключение типа «System.InvalidOperationException» произошло в MongoDB.Driver.dll, но не был обработан в пользовательском коде Дополнительная информация: Невозможно определить информацию о сериализации при р = > p.SomeDateTimeProperty.Date

Все работает, если я удаляю .Date часть в фильтре (p.SomeDateTimeProperty.Date, DateTime.Now.Date), но мне нужно сравнение yyyy \ mm \ dd, независимо от hh \ mm.

StackTrace говорит:

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

Вы пробовали это без части. – Mahdi

+0

Да, удаление части .Date предотвращает исключение, я добавил это разъяснение к вопросу - спасибо! –

ответ

0

Драйвер не знает, как сериализовать выражение Eq между двумя датами.

Try делать 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. Для второго я все еще получаю: 'Исключение типа' System.InvalidOperationException 'произошло в MongoDB.Driver.dll, но не было обработано в коде пользователя. Дополнительная информация: {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 - это функция aC# в DateTime, что драйвер MongoDb не может интерпретировать, когда вы пытаетесь применить его к свойству в свойстве модели Mongodb , Вы найдете много этого при использовании драйвера MongoDb C#, особенно при использовании Linq – pieperu

 Смежные вопросы

  • Нет связанных вопросов^_^