假设模型为
[BsonDiscriminator(RootClass = true)]
[BsonKnownTypes(typeof (Dog), typeof (Cat))]
class Animal
{
public ObjectId Id {get;set;}
public string Name {get;set;}
}
class Dog : Animal { public int BarkVolume {get;set;} }
class Cat : Animal { public int PurrVolume {get;set;} }
我可以做以下事情:
var collection = new MongoClient().GetServer().GetDatabase("test").GetCollection<Animal("Animals");
collection.Save( new Dog { Name="spot", BarkVolume=7 } );
collection.Save( new Cat { Name="kitty", PurrVolume=2 } );
然而,如果我然后尝试查询只有猫
var cats = collection.AsQueryable<Cat>();
foreach(var c in cats)
{
Console.WriteLine("{0} purrs at {1}", c.Name, c.PurrVolume);
}
我会得到一个例外“Element BarkVolume与Cat类的任何字段或属性都不匹配。”
当然,如果我将查询更改为:
var cats = collection.AsQueryable<Cat>().Where(x=>x is Cat);
然后没问题,但是有一个警告声明x是Cat始终是真的。
驱动程序没有在鉴别器_t
上注入测试的特殊原因答案 0 :(得分:3)
这是一项设计决定(经过一段时间的努力,我同意)。要指定_t
过滤器,您可以使用比OfType
更清晰的x => x is Cat
扩展方法。
在MongoDB C#驱动程序中,几乎所有内容都有类型和无类型选项。键入的选项只是为了舒适,他们不会更改生成的查询。当您真正关心查询性能和索引利用率时,这是一件好事。
例如,如果您仅使用属性查询特定类型,则不需要添加OfType
(以及生成的_t
过滤器),如果您执行查询引擎可能会使用您可能不希望它执行的_t
索引。