让我们说我有两个类: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));
是否有可能以一种实际有效的方式在谓词中包含该条件(并且看起来不像上面的最后一段代码)?