使用mongoDb c#驱动程序2.2.4,从带有Linq Expression的IMongoQueryable集合中选择会因为我的Id字段而引发错误。这是代码:
MongoDB.Driver.MongoClient myClient = new MongoDB.Driver.MongoClient("mongodb://localhost:27010");
var db = myClient.GetDatabase("YOUR_MONGODB_DATABASE");
var collection = db.GetCollection<Man>("Test");
var queryableCollection = collection.AsQueryable();
Man obj = new Man() {Id = "Man1_671", Name = "Patrick"};
collection.InsertOneAsync(obj).Wait();
// Insertion works fine
System.Linq.Expressions.Expression<Func<Man, Man>> func = mec => new Man
{
Id = mec.Id,
Name = mec.Name
};
// This line bugs using the 2.2.4 driver and works using the 2.2.1 version
var listProjection = queryableCollection.Select(func).ToListAsync().Result;
显然我必须将我的属性重命名为'_id'(经测试,它可以工作),但我不明白为什么它曾经工作(特别是因为它声明没有引入任何重大变化)。我使用的是已修复的错误吗?这是驱动程序中的错误吗? 任何帮助将不胜感激:)
编辑1:抛出的异常是: 元素'Id'与MongoDbHierarchicalStoring.Man类的任何字段或属性都不匹配。
此致 Florent的
答案 0 :(得分:0)
我已经可以通过使用实类型顶部的类进行投影来解决此问题:
internal class ProductProjection : Product
{
[BsonIgnore]
[JsonIgnore]
public string _id { set => Id = value; }
}
然后可以将聚合查询投影到此新类型中,并隐式地将其回退:
List<Product> results = _collection.Aggregate().Match(queryFilter).Project(
x => new ProductProjection
{
_id = x.Id,
....
}).ToList();
生成的产品包含任何自定义投影以及完全填充的ID字段。