我移植从旧的遗留MongoDB的司机一些代码,使用新的驱动程序,并已触及问题查询派生类型的值。我有一个包含来自公共基类的多个派生类型的集合。以前,我能够使用派生类属性查询集合(这是使用基类型声明的),并只检索派生类文档。所以考虑到这些类:使用MongoDB的C#驱动
[BsonDiscriminator(RootClass = true)]
[BsonKnownTypes(typeof(Cat),typeof(Dog))]
class Animal
{
[BsonId(IdGenerator = typeof(StringObjectIdGenerator))]
public string Id { get; set; }
public string Name { get; set; }
}
class Cat : Animal
{
public bool LikesFish { get; set; }
}
class Dog : Animal
{
public string FavouriteBone { get; set; }
}
然后我可以这样做:
MongoCollection<Animal> animals = db.GetCollection<Animal>("Animals");
var q = Query<Cat>.EQ(c => c.LikesFish, true);
var catsThatLikeFish = animals.FindAs<Animal>(q).ToList();
它工作得很好。
但是现在我必须输入滤波器,不能再编译:
IMongoCollection<Animal> animals = db.GetCollection<Animal>("Animals");
var query = Builders<Cat>.Filter.Eq(c => c.LikesFish, true);
var catsThatLikeFish = animals.FindSync(query);
,并得到这个错误:可能
Error CS0411 The type arguments for method 'IMongoCollection<Animal>.FindSync<TProjection>(FilterDefinition<Animal>, FindOptions<Animal, TProjection>, CancellationToken)' cannot be inferred from the usage. Try specifying the type arguments explicitly.
这是不再使用新的驱动程序?我们有类允许通用查询这个集合,我现在看不到任何优雅的方法。
编辑:
可悲的是独立的集合是我们混合过滤器表达式拉回使用相同的查询不同类型的非首发。在“猫狗”例如从上面这样的:
var catQuery = Query<Cat>.EQ(c => c.LikesFish, true);
var dogQuery = Query<Dog>.EQ(c => c.FavouriteBone, "Beef");
var q = Query.Or(catQuery, dogQuery);
var catsThatLikeFishOrDogsThatLikeBeef = animals.FindAs<Animal>(q).ToList();
我会看看“nameof”上述方法 - 可工作,但它似乎的老办法优雅缺乏给我。 ..
任何帮助,非常感谢!
感谢,
史蒂夫
除了Maksim的回答下面,在新API中有一个OfType()方法... IMongoCollection dogs = db.GetCollection (“Animals”)。OfType ()。 –