如何使用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
如果没有自定义变换器,是否可以实现此行为?
答案 0 :(得分:2)
默认结果转换器将能够填充根实体属性。但我们可以介绍我们的定制结果转换器。我确实使用了一个:
已准备好将.
符号转换为内部对象链(不包括集合)
因此,如果你接受并重用它,这种语法就可以了:
...
.SetProjection(Projections.ProjectionList()
.Add(Projections.Property("ContactName").As("SubClass.Name"))
.Add(Projections.Property("EmailAddress").As("Email"))
)
.SetResultTransformer(DeepTransformer<MyClass>())
你甚至可以改进它,但现在应该清楚定制变压器的想法