2010-02-05 73 views
6

假设在一个实体中有属性id,用户名,年龄,地址。现在我只想要id和用户名,我使用这个代码。在NHibernate中的投影

预测可以从查询中返回实体列表以外的内容。

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

我将如何检索值。这些值将被用于哪个对象。

回答

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

尽管我没有使用3.0框架(var关键字),我终于能够弄清楚如何使用这个答案选择个人列!整天带我去找它 – 2010-08-13 20:34:59