SessionFactory NHIBERNATE является дорогой операцией, таким образом, хорошая стратегия к, создает Singleton, которая гарантирует, что существует ТОЛЬКО ОДИН экземпляр SessionFactory в памяти:
public class NHibernateSessionManager
{
private readonly ISessionFactory _sessionFactory;
public static readonly NHibernateSessionManager Instance = new NHibernateSessionManager();
private NHibernateSessionManager()
{
if (_sessionFactory == null)
{
System.Diagnostics.Debug.WriteLine("Factory was null - creating one");
_sessionFactory = (new Configuration().Configure().BuildSessionFactory());
}
}
public ISession GetSession()
{
return _sessionFactory.OpenSession();
}
public void Initialize()
{
ISession disposeMe = Instance.GetSession();
}
}
Тогда в Вашем Глобальном. Asax Application_Startup, можно инициализировать его:
protected void Application_Start()
{
NHibernateSessionManager.Instance.Initialize();
}
Это может работать (не проверено) ...
var clubs = ClubRepository.Where(c=>c.MemberShips.Any(m=>m.User.Age > 45));
Вот один из способов сделать это:
var clubs = clubRepository
.SelectMany(c => c.Memberships, (c, m) => new { c, m })
.Where(x => x.m.User.Age > 45)
.Select(x => x.c);