2013-06-11 2 views
0

Я полный noob для Fluent NHibernate, и я использую шаблон объекта запроса на основе рекомендации. Который я тоже новичок. Я постараюсь, чтобы примеры кода были краткими и полезными.Условные ограничения в Fluent NHibernate с использованием шаблона объекта запроса

Класс пользователя:

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

Видимость:

public enum VisibilityType { 
    Anybody, 
    OwnersOnly, 
    Nobody 
} 

Класс автомобиля:

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

Поэтому мне нужно написать условный метод ограничения для объекта запроса. Возвратите все автомобили, у которых есть VisibilityType.Public, но если у автомобиля есть Visibility значение свойства VisibilityType.OwnersOnly, ограничьте возврат к тем пользователям, которые принадлежат к этой группе.

Вот текущий метод ограничения, что я работаю, но без условия:

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(); 
    } 
} 

_?

ответ

0

идея, чтобы получить показанные автомобили

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>();