使用C#MongoDB LINQ和鉴别器

Gre*_*May 6 c# linq mongodb discriminator

我有一个MongoDB集合,其中包含三个不同类(A,B,C)的文档,这些类都继承自公共类D.

使用官方的C#驱动程序,我插入了所有三种类型(A,B,C)的文档,它们都与_t鉴别器一起正确显示,并且在我的代码中,他们的类映射被注册.

如果我发出LINQ查询,如下所示(使用VB):

dim Result = database.GetCollection("mycol").AsQueryable(Of C).Where(some where clause)
Run Code Online (Sandbox Code Playgroud)

如果我计算结果,我得到一个错误"元素'来自类A的元素名称'不匹配类C的任何字段或属性."

判断器是不是要在AsQueryable(Of C)代码中引入?当我发出.Count特定于C类元素的Where子句时,它似乎被应用于A,B和C的文档.

我试过添加.OfType(Of C)没有效果,尝试先转换为List .ToList,但我继续得到同样的错误.有任何想法吗?

作为背景,我的客户端代码通常会处理类型为D的对象.A,B,C共享从D继承的许多常见属性,我想将索引放在上面,因此我将它们放在一个集合中.但是,偶尔我需要在特殊情况下直接引用类型A,B或C的对象.

Rob*_*tam 12

使用多态类型层次结构时,集合变量和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
}
Run Code Online (Sandbox Code Playgroud)

出于诊断目的,您可以使用以下命令查看相应的本机MongoDB查询:

var json = ((MongoQueryable<A>)query).GetMongoQuery().ToJson();
Run Code Online (Sandbox Code Playgroud)

请注意,您必须将查询强制转换为MongoQueryable <A>(而不是MongoQueryable <D>),因为OfType()调用更改了IQueryable的类型.

  • 神奇的信息块.我鼓励你将它添加到mongodb文档中的多态性部分(或指向它,如果它已经存在) - 我知道我可以使用它. (2认同)

Cra*_*son 3

使用.AsQueryable<D>().OfType<C>. 这应该有效地自动包含鉴别器。问题是我们不一定知道您对 A、B 和 C 使用相同的集合,因此不知道当您这样做时AsQueryable<C>(),我们实际上需要添加一个鉴别器。我们将研究如何在未来使其更加无缝。