我有一个 MongoDB 集合,包含三个不同类(A、B、C)的文档,它们都继承自公共类 D。
使用官方 C# 驱动程序,我插入了所有三种类型(A、B、C)的文档,并且它们都通过 _t 鉴别器正确显示,并且在我的代码中注册了它们的类映射。
如果我发出如下所示的 LINQ 查询(使用 VB):
dim Result = database.GetCollection("mycol").AsQueryable(Of C).Where(some where clause)
如果我计算这个结果,我会收到错误“元素‘来自 A 类的元素名称’与 C 类的任何字段或属性不匹配。”
鉴别器不是要在此处启动吗?AsQueryable(Of C)
代码?看来当我发出.Count
我的Where 子句特定于C 类的元素,它应用于A、B 和C 的文档。
我尝试过添加.OfType(Of C)
没有效果,尝试先转换为列表.ToList
,但我仍然遇到同样的错误。有任何想法吗?
作为背景,我的客户端代码通常会处理 D 类型的对象。A、B、C 共享许多从 D 继承的公共属性,我想在这些属性上放置索引,因此我将它们放在一个集合中。但是,有时在特殊情况下我需要直接引用 A、B 或 C 类型的对象。
使用多态类型层次结构时,您的集合变量和 LINQ 查询应从基类开始。例如,要从数据库中读回类型 A 的所有文档,您可以编写:
var collection = database.GetCollection<D>("mycol");
var query = collection.AsQueryable<D>().OfType<A>();
foreach (var a in query)
{
// process document of type A
}
出于诊断目的,您可以使用以下命令查看相应的本机 MongoDB 查询:
var json = ((MongoQueryable<A>)query).GetMongoQuery().ToJson();
请注意,您必须将查询转换为 MongoQueryable (不是 MongoQueryable),因为 OfType() 调用更改了 IQueryable 的类型。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)