C#MongoDB&;投影。失败,出现序列化异常

C#MongoDB&;投影。失败,出现序列化异常,c#,mongodb,linq,projection,C#,Mongodb,Linq,Projection,假设我有一个收藏,比如: { id: "1" name: "collection 1" properties: "Some properties." } 类表示为 [BsonIgnoreExtraElements] public class InfoPOCO { [BsonRepresentation(BsonType.ObjectId)] public string Id { get; set; } [BsonElement("name")] pu

假设我有一个收藏,比如:

 {
 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});
Builders.Projection.Include(=>new{{uu.Name});
并与其他参数一起调用(无需投影即可正常工作)

return GetDataBase().GetCollection(collectionName).Find(Expr)。
projectionDefinition.Skip(Offset).Limit(Limit).Sort(Sort).ToList()
然后我得到以下错误:

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)
System.InvalidOperationException:无法确定的序列化信息
_=>新f_u匿名类型2`1
结果跟踪:
在MongoDB.Driver.ExpressionFieldDefinition`1.Render(IBMOSonSerializer`1 documentSerializer,IBMOSonSerializerRegistry serializerRegistry)
在MongoDB.Driver.SingleFieldProjectionDefinition`1.Render(IBMONSerializer`1 sourceSerializer,IBMONSerializerRegistry serializerRegistry)
在MongoDB.Driver.knownResultTypeProjectOnDefinitionAdapter`2.Render(IBMOSonSerializer`1 sourceSerializer,IBMOSonSerializerRegistry serializerRegistry)
在MongoDB.Driver.MongoCollectionImpl`1.CreateFindOperation[Tproject](过滤器定义`1过滤器,FindOperations`2选项)
在MongoDB.Driver.MongoCollectionImpl`1.FindSync[tProject](IClientSessionHandle会话,FilterDefinition`1筛选器,FindOptions`2选项,CancellationToken CancellationToken)
在MongoDB.Driver.MongoCollectionImpl`1.c__显示类35_0`1.b__0(IClientSessionHandle会话)
在MongoDB.Driver.MongoCollectionImpl`1.UsingImplicitSession[TResult](Func`2 Func,CancellationToken CancellationToken)
在MongoDB.Driver.MongoCollectionImpl`1.FindSync[tProject](FilterDefinition`1过滤器,FindOptions`2选项,CancellationToken CancellationToken)
在MongoDB.Driver.FindFluent`2.ToCursor(CancellationToken CancellationToken)
在MongoDB.Driver.IAsyncCursorSourceExtensions.ToList[TDocument](IAsyncCursorSource`1 source,CancellationToken CancellationToken)

可能是什么原因,当我不使用投影时,它正在获取整个集合。我不知道我是否需要映射这些类?(以为自动地图会占上风)。我也尝试在类中创建构造函数。但还是一样的错误。任何帮助都将不胜感激。谢谢大家!

我终于明白了!是的,我知道,有点慢

问题是,当我试图将其映射为:

Builders<InfoPOCO>.Projection.Include(_ => new{_.Name, _.Properties});
Builders.Projection.Include(=>new{{uu.Name,u.Properties});
它是强类型表达式,结果映射到匿名类型。如果我在获取forEach的同时使用forEach,那么我可以获取这些值。所以我现在使用的解决方案很简单。我将我的预测更改为:

Builders<InfoPOCO>.Projection.Include(_ => _.Name).
                              Include(_ => _.Properties);
Builders.Projection.Include(\u=>\ ux.Name)。
包括(=>u0.Properties);

这管用!我并不是说这是一个完美的解决方案或解释,但我看到很多人都在努力解决这个问题,所以我只提一个解决办法。希望它能帮助像我这样的人摆脱几个小时的谷歌搜索

你真的输入了
Builders
T
应该是您实际的类类型。是的,我知道这是泛型,我已经把要包含在这里的问题简化了,让我编辑掉T以避免混淆。我认为您需要是“匿名类型”,这意味着您在其中放错了东西。谢谢提示,也尝试了,仍然是相同的错误伙伴。代码运行良好,没有任何投影。显示类定义。也可以尝试
\uu
以外的方法,如
p
或标准字母标识符。
Builders<InfoPOCO>.Projection.Include(_ => _.Name).
                              Include(_ => _.Properties);