除非使用结果转换器,否则投影将导致一个匿名对象列表,其中包含投影的值。这对于数据绑定是足够的。
对于其他用途,您需要设置一个结果转换器,该转换器将创建已知类型的对象。 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>();
在这些例子中,结果类不需要是映射类,并且必须具有所选的属性。
partial class Result
{
public int Id { get; set; }
public string Username { get; set; }
}