【问题标题】:Projections in NHibernateNHibernate 中的投影
【发布时间】:2023-04-03 11:35:01
【问题描述】:

假设在一个实体中有属性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();

我将如何检索这些值。将在哪个对象中获取这些值。

【问题讨论】:

    标签: nhibernate projection resulttransformer


    【解决方案1】:

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

    对于其他用途,您想设置一个结果转换器,它将创建已知类型的对象。 AliasToBeanTransformer 将为每一行创建一个指定类型的对象,并将其属性设置为行值。

    如果您知道结果的类型,则可以使用通用的List&lt;T&gt;() 方法。

    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 关键字),但我终于能够弄清楚如何使用这个答案来选择个人列!花了我一整天才找到它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多