【问题标题】:Get subclass type from projection with NHibernate使用 NHibernate 从投影中获取子类类型
【发布时间】:2011-02-16 18:24:08
【问题描述】:

我正在尝试对名为 Log 的类型进行投影。日志引用了一个名为 Company 的超类。每个公司类型都映射到每个子类的表。

我在 Log 上进行投影时是否可以得到 Company 的类型? 我目前在每个子类上都有一个 Enum 属性(未映射),因此我可以对 Company 类型执行切换,但由于它没有映射到任何东西,我无法对其进行投影。

我已经尝试过Projections.Property("log.Company.class") 但这不起作用:(

PS:我找不到很多适合这个问题的标签。如果有人对更具体的标签有想法,请告诉我。

【问题讨论】:

    标签: nhibernate types projection


    【解决方案1】:

    您可以执行以下操作...

    session.CreateCriteria<Log>()
           .CreateAlias("Company", "company")
           .SetProjection(Projections.Property("company.class"))
    

    但是那个投影只能用于过滤和排序; NHibernate 不会返回结果集中的 System.Type(它返回一个整数,内部使用)。

    如果您需要了解公司的具体类型,您可以执行以下操作:

    var logs = session.CreateCriteria<Log>()
                      .SetFetchMode("Company", FetchMode.Join) //avoid SELECT N+1
                      .List<Log>()
    

    然后,检索每一行的类型:

    foreach (var log in logs)
        string companyClassName = session.GetEntityName(log.Company);
    

    【讨论】:

    • 这是可以预测的吗?我的意思是,我可以把它翻译成一个字符串,这基本上是我需要的,来显示公司的类型吗?
    • 可以预测,但只能通过逆向工程。我会根据您的需要添加一个替代方案。
    • 这看起来不错,但无论如何它都不是一个连接,因为我使用每个子类的表?我会试一试:)
    • 很好用。我只需要知道我是否可以使用整数作为参考,或者我必须通过会话将它们转换为正确的类名。我正在使用 AliasToBeanConstructor 转换器,其中我将整数转换为我自己的显示名称。但是如果我需要使用会话来翻译它,我需​​要改变我的方法。
    • 当我有这种复杂的投影时,我使用 .List 而不是使用 AliasToBean,然后使用 Linq 到对象进行映射。顺便说一句,如果这对您有所帮助,通常很高兴接受答案...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多