在父类型

时间:2016-11-02 17:03:40

标签: c# mongodb fluent

让我们说我有两个类:A类和B类继承自A。有一个类型A项的Mongo集合,它包含该类型的项目以及类型B的项目(如B类继承自A)类。我使用MongoDB.Driver v2.2.0构造谓词以用于流畅查询。

public class A
{
    public long Id { get; set; }
}

public class B : A
{
    public bool Show { get; set; }
}

有一个查询可以检索该集合中的所有项目(类型A和B),并且谓词用于允许对类型A的多个属性进行过滤。

Expression<Func<A, bool>> predicate = PredicateBuilder.True<A>();

if (someCondition)
{
    predicate = predicate.And(x => x.Id = 123);
}

 FilterDefinitionBuild<A> filterBuilder = Builders<A>.Filter;
 FilterDefinition<A> filterDefinition = filterBuilder.Where(predicate);

 IFindFluent<A,A> fluentFind = aCollection.Find(filterDefinition); //aCollection is of type IMongoCollection<A>

var results = await retryPolicy
            .ExecuteAsync(() => fluentFind.ToListAsync())
            .ConfigureAwait(false);

最近,需要根据仅存在于B类中的属性(因此在B类的项目中)从结果中排除某些B类项目。解决方案起初似乎相当容易,只需在谓词中添加所需的条件:

predicate = predicate.And(x => !(x is B) || !((B)x).Show);

然而,在测试完之后,似乎查询被错误地翻译了,我收到了以下错误 - System.InvalidOperationException: Convert({document}).Show is not supported.

最后,我不得不采取一种丑陋的方式来做到这一点:

filterDefinition = filterBuilder.And(filterDefinition,
                filterBuilder.Ne("show", true));

是否有可能以一种实际有效的方式在谓词中包含该条件(并且看起来不像上面的最后一段代码)?

0 个答案:

没有答案