Nhibernate项目进入类属性

时间:2014-09-05 03:01:20

标签: c# nhibernate projection

如何使用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”的setter

如果没有自定义变换器,是否可以实现此行为?

1 个答案:

答案 0 :(得分:2)

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

已准备好将.符号转换为内部对象链(不包括集合)

因此,如果你接受并重用它,这种语法就可以了:

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

你甚至可以改进它,但现在应该清楚定制变压器的想法