C # MongoDB & Проекция.Сбой с сериализацией Исключение - PullRequest
0 голосов
/ 08 июня 2018

Допустим, у меня есть коллекция вроде:

 {
 id: "1"
 name: "collection 1"
 properties: "Some properties."
 }

С представлением класса как

[BsonIgnoreExtraElements]
public class InfoPOCO {
    [BsonRepresentation(BsonType.ObjectId)]
    public string Id { get; set; }

    [BsonElement("name")]
    public string Name { get; set; }

    [BsonElement("properties")]
    public string Properties { get; set; }
 } 

Теперь, если я собираюсь создать проекцию типа

Builders<InfoPOCO>.Projection.Include(_ => new{_.Name});

И назовите его другими параметрами (Это работает нормально без проекции)

return GetDataBase().GetCollection<InfoPOCO>(collectionName).Find(Expr).
Project<InfoPOCO>(projectionDefinition).Skip(Offset).Limit(Limit).Sort(sort).ToList<InfoPOCO>()

Тогда я получаю следующую ошибку:

System.InvalidOperationException : Unable to determine the serialization information for
_ => new <>f__AnonymousType2`1


 Result StackTrace: 
at MongoDB.Driver.ExpressionFieldDefinition`1.Render(IBsonSerializer`1 documentSerializer, IBsonSerializerRegistry serializerRegistry)
   at MongoDB.Driver.SingleFieldProjectionDefinition`1.Render(IBsonSerializer`1 sourceSerializer, IBsonSerializerRegistry serializerRegistry)
   at MongoDB.Driver.KnownResultTypeProjectionDefinitionAdapter`2.Render(IBsonSerializer`1 sourceSerializer, IBsonSerializerRegistry serializerRegistry)
   at MongoDB.Driver.MongoCollectionImpl`1.CreateFindOperation[TProjection](FilterDefinition`1 filter, FindOptions`2 options)
   at MongoDB.Driver.MongoCollectionImpl`1.FindSync[TProjection](IClientSessionHandle session, FilterDefinition`1 filter, FindOptions`2 options, CancellationToken cancellationToken)
   at MongoDB.Driver.MongoCollectionImpl`1.<>c__DisplayClass35_0`1.<FindSync>b__0(IClientSessionHandle session)
   at MongoDB.Driver.MongoCollectionImpl`1.UsingImplicitSession[TResult](Func`2 func, CancellationToken cancellationToken)
   at MongoDB.Driver.MongoCollectionImpl`1.FindSync[TProjection](FilterDefinition`1 filter, FindOptions`2 options, CancellationToken cancellationToken)
   at MongoDB.Driver.FindFluent`2.ToCursor(CancellationToken cancellationToken)
   at MongoDB.Driver.IAsyncCursorSourceExtensions.ToList[TDocument](IAsyncCursorSource`1 source, CancellationToken cancellationToken)

Что может быть причиной этого, когдаЯ не использую проекцию, она получает всю коллекцию.Я не знаю, нужно ли мне сопоставить классы?(Думал, Авто Карта возьмет это).Я попытался сделать конструктор в классе тоже.Но все та же ошибка.Любая помощь будет высоко оценен.Спасибо !

1 Ответ

0 голосов
/ 08 июня 2018

Я наконец понял!Да, я знаю, довольно медленно, да.

Проблема в том, что, когда я пытался отобразить его следующим образом:

Builders<InfoPOCO>.Projection.Include(_ => new{_.Name, _.Properties});

Это строго типизированное выражение, и результат отображается в анонимный тип.Если я использую forEach одновременно с загрузкой, я могу получить эти значения.Так что решение, которое я использую сейчас, простое.Я изменил свою проекцию на:

Builders<InfoPOCO>.Projection.Include(_ => _.Name).
                              Include(_ => _.Properties);

Это работает!Я не говорю, что это идеальное решение или объяснение, но я вижу, что многие люди борются с этим, поэтому просто упоминают обходной путь.Надеюсь, это поможет кому-то вроде меня пройти часы поисков в Google!

...