为什么不AsQueryable <t>意味着对_t鉴别器</t>的过滤器

时间:2014-11-27 13:58:40

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

假设模型为

[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

上注入测试的特殊原因

1 个答案:

答案 0 :(得分:3)

这是一项设计决定(经过一段时间的努力,我同意)。要指定_t过滤器,您可以使用比OfType更清晰的x => x is Cat扩展方法。

在MongoDB C#驱动程序中,几乎所有内容都有类型和无类型选项。键入的选项只是为了舒适,他们不会更改生成的查询。当您真正关心查询性能和索引利用率时,这是一件好事。

例如,如果您仅使用属性查询特定类型,则不需要添加OfType(以及生成的_t过滤器),如果您执行查询引擎可能会使用您可能不希望它执行的_t索引。