1
votes

I'm a complete noob to Fluent NHibernate, and I'm using the Query Object Pattern based on a recommendation. Which I'm also new to. I'll try to keep the code samples concise and helpful.

User class:

public class User {
    public Guid ID { get; set; }
    public string Name { get; set; }
}

Visibility:

public enum VisibilityType {
    Anybody,
    OwnersOnly,
    Nobody
}

Car class:

public class Car {
    public Guid ID { get; set; }
    public VisibilityType Visibility { get; set; }
    public ICollection<User> Owners { get; set; }
}

So I need to write a conditional restriction method for the query object. Return all cars that have VisibilityType.Public, but if a car has Visibility property value of VisibilityType.OwnersOnly, restrict the return to users who belong to that group.

Here's the current restriction method that I have working, but without the condition:

public class CarQueryObject
{

    private User user { get; set; }
    private const string OwnersProperty = "Owners";
    private const string OwnersIDProperty = "Owners.ID";

    public CarQueryObject RestrictToOwners()
    {
        // How do I add a conditional criteria here?  Only restrict by owner
        // if the QueryObject has VisibilityType.OwnersOnly?  Note that it should
        // *NOT* restrict VisibilityType.Anybody
        CreateOwnersAlias();
        Criteria.Add(Restrictions.Eq(OwnersIDProperty, user.Id));
        return this;
    }

    public CarQueryObject JoinFetchOwned()
    {
        Criteria.SetFetchMode(OwnersProperty, FetchMode.Join);
        return this;
    }

    public void CreateOwnersAlias()
    {
        Criteria.CreateAlias(OwnersProperty, OwnersProperty, JoinType.LeftOuterJoin);
        JoinFetchOwned();
    }
}

?_?

1

1 Answers

1
votes

an idea to get shown cars

var carsShown = session.CreateCriteria<Car>()
    .JoinAlias("Owner", "owner")
    .Add(Expressions.Or(
        Expression.Eq("Visibility", Visibility.Anybody),
        Expression.Eq("Visibility", Visibility.OwnersOnly) && Expression.Eq("owner.Id", currentUser.Id)
    ))
    .List<Car>();