Разница в NHibernate между Query <T>, Get <T> и Load <T>

Я хотел бы найти разницу в использовании этих трех способов получения данных из базы данных при выполнении чего-то вроде:

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

или же

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

или даже так:

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

И добавив еще один вопрос к этому, какQuery() отличается отQueryOver()?

Я прочитал некоторые ответы здесь в stackoverflow, но, поскольку большинство из них касалось начала использования Linq и NHibernate 3, я хотел бы знать, каков сценарий сегодня.

Ответы на вопрос(2)

Ваш ответ на вопрос