Neil Ramsbottom
Neil Ramsbottom

Reputation: 45

FluentNHibernate HasManyToMany Conditional Mappings

Is there a way that I filter out rows in a HasManyToMany mapping?

I have three tables (legacy, not able to change them) Service, Resource and ResourceService. The ResourceService allows multiple resources to link to multiple services but it also has an "Active" column.

On my Resource domain object I've mapped the services linked to the resource with a "ProvidedBy" property which returns an array of the services. The problem is that I only want rows from services that are marked as active.

Am I missing something basic here?

Upvotes: 1

Views: 1725

Answers (3)

Chris Haines
Chris Haines

Reputation: 6535

You can actually achieve outer join conditions using Filters.

See FluentNHibernate HasManyToMany Conditional Mappings

Upvotes: 0

James Gregory
James Gregory

Reputation: 14223

Wouldn't this be a candidate for a Where?

HasManyToMany(x => x.Whatevers)
  .Where(x => x.Active);

Upvotes: 0

David M
David M

Reputation: 72840

Fluent NHibernate release 1.0 did not support NHibernate filters or filter-defs. I submitted a patch to James Gregory and team a while back which they have now incorporated in the trunk, so if you get the trunk rather than the release version you'll find the ability to do this sort of thing included.

Essentially, you can set up a class that inherits from FilterDefinition like so:

public class TestFilter : FilterDefinition
{
    public TestFilter()
    {
        WithName("test")
            .WithCondition("Age > :age")
            .AddParameter("age", NHibernateUtil.Int32);
    }
}

and then apply this filter in your fluent mapping:

HasManyToMany(x => x.Oldies)
    .Table("People")
    .ApplyFilter<TestFilter>();

You can set the parameter value and enable the filter using the session object as normal:

session.EnableFilter("test").SetParameter("age", 65);

Upvotes: 4

Related Questions