Прогнозы в NHibernate

допустим в сущности есть атрибуты id, username, age, address. Теперь мне просто нужен идентификатор и имя пользователя, и я использую для этого этот код.

Проекции позволяют возвращать из запроса что-то отличное от списка сущностей.

var proj = Projections.ProjectionList()
    .Add(Projections.Property("Id"), "Id")
    .Add(Projections.Property("Username"), "Username");

var list2 = DetachedCriteria.For<User>()
    .Add(Expression.Eq("Username", "lachlan"))
    .GetExecutableCriteria( sessionFactory.GetCurrentSession())
    .SetProjection( proj )
    .List();

Как я буду получать значения. В каком объекте будут взяты эти значения.


person Rishabh Ohri    schedule 05.02.2010    source источник


Ответы (1)


Если не используется преобразователь результата, результатом проекции будет список анонимных объектов с проецируемыми значениями. Этого будет достаточно для привязки данных.

Для других целей вы хотите установить преобразователь результата, который будет создавать объекты известного типа. AliasToBeanTransformer создаст объект указанного типа для каждой строки и установит его свойства в значения строки.

Если вы знаете тип результатов, вы можете использовать общий метод List<T>().

var proj = Projections.ProjectionList()
    .Add(Projections.Property("Id"), "Id")
    .Add(Projections.Property("Username"), "Username");

var list2 = DetachedCriteria.For<User>()
    .Add(Expression.Eq("Username", "lachlan"))
    .GetExecutableCriteria( sessionFactory.GetCurrentSession())
    .SetProjection( proj )
    .SetResultTransformer(Transformers.AliasToBean(typeof(Result)))
    .List<Result>();

Преобразователи результатов также можно использовать в запросах SQL и HQL.

list2 = Session.CreateSQLQuery("select Id, Username from user_table")
    .SetResultTransformer(Transformers.AliasToBean(typeof(Result)))
    .List<Result>();

list2 = Session.CreateQuery("select Id, Username from User")
    .SetResultTransformer(Transformers.AliasToBean(typeof(Result)))
    .List<Result>();

В этих примерах класс Result не обязательно должен быть сопоставленным классом и должен иметь выбранные свойства.

partial class Result
{
    public int Id { get; set; }
    public string Username { get; set; }
}
person Lachlan Roche    schedule 05.02.2010
comment
хотя я не использовал структуру 3.0 (ключевое слово var), я наконец смог понять, как выбирать отдельные столбцы, используя этот ответ! у меня ушел весь день, чтобы найти его - person ; 14.08.2010