从具有Linq表达式的IMongoQueryable集合中选择会引发错误[c#driver 2.2.4]

时间:2016-07-21 15:41:38

标签: c# mongodb mongodb-.net-driver mongodb-csharp-2.0

使用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的

1 个答案:

答案 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字段。