The driver complains when I attempt to filter records by type/discriminator:
var types = new List<Type> { typeof (ConcreteClassA), typeof (ConcreteClassB) };
query &= Builders<AbstractClass>.Filter.Where (obj => types.Any (type => obj.GetType ().IsInstanceOfType (type)));
value(System.Collections.Generic.List`1[System.Type]) is not supported.
Even if I try to compare against one type I get an exception:
query &= Builders<AbstractClass>.Filter.Where (obj => obj.GetType ().IsInstanceOfType (typeof (ConcreteClassA));
I know in the 1.x driver I could use an OfType<ConcreteClassA>() solution. Is there any similar method when using a FilterDefinition ?
I recommend you to use OfType like below that will give you FilterDefinition:
var filterTypeA = Builders<AbstractClass>.Filter.OfType<ConcreteClassA>();
var filterTypeB = Builders<AbstractClass>.Filter.OfType<ConcreteClassB>();
var filter = Builders<AbstractClass>.Filter.Or(filterA, filterB);
var result = collection.Find(filter).ToListAsync().Result;
But you can also use is operator like below:
var filter = Builders<AbstractClass>.Filter
.Where(w=> w is ConcreteClassA || w is ConcreteClassB);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With