【问题标题】:Nhibernate project into class property将项目休眠到类属性中
【发布时间】:2014-09-05 03:01:19
【问题描述】:

如何使用 NHibernate 投影到类属性中?例如:

[Test]
public void Test()
{
    MyClass dto = null;

    var test = CurrentSession.CreateCriteria<Contact>()
        .Add(Restrictions.Eq("ContactName", "John Smith"))
        .SetProjection(Projections.ProjectionList()
            .Add(Projections.Property("ContactName").WithAlias(() => dto.SubClass.Name))
            .Add(Projections.Property("EmailAddress").WithAlias(() => dto.Email))
        )
        .SetResultTransformer(Transformers.AliasToBean<MyClass>())
        .List<MyClass>();

    Assert.That(test[0].SubClass.Name, Is.EqualTo("John Smith"));
}

class MyClass
{
    public string Email { get; set; }

    public MySubClass SubClass { get; set; }
}

class MySubClass
{
    public string Name { get; set; }
}

如您所见,我有一个简单的查询,想将 1 行转换为 1 个对象 - 没有列表但有一个子类。不幸的是,它失败了:

NHibernate.PropertyNotFoundException:在“MyTest+MyClass”类中找不到属性“Name”的设置器

是否可以在没有自定义转换器的情况下实现此行为?

【问题讨论】:

    标签: c# nhibernate projection


    【解决方案1】:

    默认结果转换器将能够填充根实体属性。但是我们可以介绍我们的自定义结果转换器。我确实使用过一个:

    准备将. 表示法转换为内部对象链(不包括集合)

    所以,如果你接受它并重用它,这个语法就可以工作:

    ...
    .SetProjection(Projections.ProjectionList()
        .Add(Projections.Property("ContactName").As("SubClass.Name"))
        .Add(Projections.Property("EmailAddress").As("Email"))
    )
    .SetResultTransformer(DeepTransformer<MyClass>())
    

    你甚至可以改进它,但是自定义转换器的想法现在应该很清楚了

    【讨论】:

      猜你喜欢
      • 2016-09-20
      • 1970-01-01
      • 2013-01-07
      • 1970-01-01
      • 1970-01-01
      • 2011-11-02
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      相关资源
      最近更新 更多