How to do Inner Join in NHibernate
I had spent a lot of extensive time trying to find how to do a fairly simple inner join from two tables in NHibernate, and because the documentation was so poor for NHibernate, I had made so many attempts, and almost gave up.
Previous attempts: –
public static IList<Subscription> GetSubscriberDetails(int subscriberID)
{
ICriteria criteria = SessionFactoryContext.GetCurrentSession().CreateCriteria(typeof(Subscription));
criteria.CreateAlias(“SubscriberDetails”, “s”);
criteria.Add(Expression.Eq(“SubscriberID”, 1));
criteria.Add(Expression.Eq(“s.SubscriberID”, 1));
//criteria.CreateCriteria(“SubscriptionPackage”, JoinType.InnerJoin);
criteria.Add(Expression.Eq(“SubscriberID”, subscriberID));
return (IList<Subscription>)criteria.List<Subscription>();
} gave only subscription for Subscriber ID = 1, which is hardcoded!! 😦
public static IList<Subscription> GetSubscriberDetails(int subscriberID)
{
ICriteria criteria = SessionFactoryContext.GetCurrentSession().CreateCriteria(typeof(Subscription));
criteria.CreateAlias(“SubscriberDetails”, “s”);
criteria.Add(Expression.Eq(“SubscriberID”, 1));
criteria.Add(Expression.Eq(“s.SubscriberID”, 1));
return (IList<Subscription>)criteria.List<Subscription>();
} gave an error along the lines of the query being used more than once!!
public static IList<Subscription> GetSubscriberDetails(int subscriberID)
{
ICriteria criteria = SessionFactoryContext.GetCurrentSession().CreateCriteria(typeof(Subscription));
criteria.CreateAlias(“GetSubscriberDetails”, “s”);
criteria.Add(Expression.Eq(“SubscriberID”, “s.SubscriberID”));
criteria.CreateCriteria(“SubscriberDetails”, JoinType.InnerJoin);
return (IList<Subscription>)criteria.List<SubscriberDetails>();
} gave an error
The value “DatesDB.Subscription.SubscriberDetails” is not of type “DatesDB.Subscription.Subscription” and cannot be used in this generic collection.
Looking at lots of blog posts in Google, people had used detached query, but I hadn’t got this working at all with the following: –
var query = DetachedCriteria.For<Subscription>()
.CreateCriteria("SubscriberID", JoinType.InnerJoin)
.AddOrder(Order.Asc("SubscriberID"));