Diferencia de NHibernate entre Consulta <T>, Obtener <T> y Cargar <T>

Me gustaría encontrar la diferencia en el uso de estas tres formas de obtener datos de la base de datos al hacer algo como:

public T GetById(int id) {
    using (var db = Database.Session) {
        using (var t = db.BeginTransaction()) {
            try {
                return db.Get<T>(id);
            }
            catch (Exception) {
                if (!t.WasCommitted) {
                    t.Rollback();
                }
                throw;
            }
        }
    }
}

o

public T GetById(int id) {
    using (var db = Database.Session) {
        using (var t = db.BeginTransaction()) {
            try {
                return Query<T>().First(x=>x.Id == id);
                //or something like
                //return Query<T>().Where(x=>x.Id == id).FirstOrDefault();
                //or
                //return QueryOver<T>().Where(x=>x.Id == id).FirstOrDefault;
            }
            catch (Exception) {
                if (!t.WasCommitted) {
                    t.Rollback();
                }
                throw;
            }
        }
    }
}

o incluso de esta manera:

public T GetById(int id) {
    using (var db = Database.Session) {
        using (var t = db.BeginTransaction()) {
            try {
                return db.Load<T>(id);
            }
            catch (Exception) {
                if (!t.WasCommitted) {
                    t.Rollback();
                }
                throw;
            }
        }
    }
}

Y agregando otra pregunta a esta, ¿cómoQuery() difiere deQueryOver()?

He leído algunas respuestas aquí en stackoverflow, pero dado que la mayoría de ellas se referían al comienzo de usar Linq y NHibernate 3, me gustaría saber cómo es el escenario hoy.

Respuestas a la pregunta(2)

Su respuesta a la pregunta