Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Filter types in collection using FilterDefinition

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 ?

like image 778
Graeme Avatar asked Oct 26 '25 22:10

Graeme


1 Answers

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);
like image 51
shA.t Avatar answered Oct 28 '25 14:10

shA.t



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!