This blog shows us how we can apply a filter onto the class definition:-
<class name="Domain.Model.BlogPost, Domain.Model" table="Posts"
where="(IsLive=1)">
...
</class>
However be warned this will always return blog posts that are live. Sometimes you may want to get blog posts that are not live. If you use a filter this way then you will never be able to return isLive=0 or ALL blogs regardless of the flag.Fortunately NHibernate allows us to switch filters on/off at a flick of a switch, add this to your mappings file:-
<filter-def name="BlogFlag">
<filter-param name=":isLive" type="System.Int"/>
</filter-def>
<class name="Domain.Model.BlogPost, Domain.Model" table="Posts">
<filter name="BlogFlag" condition="(isLive=:flag)"/>
...
</class>
Using the flag could not be simpler, just set the flag before you query:-//return live blogs
session.EnableFilter("BlogFlag").SetParameter("isLive", 1);
session.QueryOver<MyEntity>();
//return blogs that are not live
session.EnableFilter("BlogFlag").SetParameter("isLive", 0);
session.QueryOver<MyEntity>();
//return all blogs
session.QueryOver&t;MyEntity>();
Now one question you are asking is why would I use filters? Why wouldn't I just use //Use a where clause! Isn't this more sensible? session.QueryOver<MyEntity>() .Where(w => w.IsLive == isLive);However one of the unknown undocumented features of filters is that the database column IsLive, DOES not need to mapped to a fully mapped property.
The second reason is that if I ALWAYS want just live Blog posts therefore adding where="(IsLive=1)"> to the class definition makes sense as the developer will does not need to remember to add the where clause for EVERY query.
In the next blog post I will show you how to use filters on collections.