NHibernate的预测

时间:2010-02-05 13:04:03

标签: nhibernate projection resulttransformer

假设在一个实体中有属性id,用户名,年龄,地址。现在我只想要id和用户名,我就用它代码了。

投影可以从查询中返回除实体列表之外的其他内容。

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();

如何检索值。在哪个对象中将采用这些值。

1 个答案:

答案 0 :(得分:27)

除非使用结果转换器,否则投影将生成具有投影值的匿名对象列表。这对于数据绑定就足够了。

对于其他用途,您需要设置一个结果转换器,它将创建一个已知类型的对象。 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; }
}