NHibernate中的投影

7
假设一个实体拥有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个回答

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

虽然我没有使用3.0框架(var关键字),但最终我还是能够通过这个答案找到如何选择单独的列!花了我一整天才找到它。 - user195488

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接