我有一个与父母一对一的课程。我希望通过子项公开父级的属性,而不直接暴露父级。我也想通过这些属性查询和订购。
类
public class Organization
{
public virtual string Name { get; set; }
public virtual bool IsNonProfit { get; set; }
}
public class Contact
{
private Organization _organization;
public virtual string OrganizationName
{ get { return _organization.Name; } }
public virtual bool OrganizationIsNonProfit
{ get { return _organization.IsNonProfit; } }
}
映射
public class OrganizationMap : ClassMap<Organization>
{
public OrganizationMap()
{
Map(x => x.Name);
Map(x => x.IsNonProfit);
}
}
public class ContactMap : ClassMap<Contact>
{
public ContactMap()
{
References<Organization>(Reveal.Member<Contact>("_organization"))
.Access.CamelCaseField();
}
}
查询
public class Example
{
private ISessionFactory _sessionFactory;
public Example(ISessionFactory sessionFactory)
{
_sessionFactory = sessionFactory;
}
public IEnumerable<Contact> DoQuery(int forPage, int rowsPerPage)
{
using (var session = _sessionFactory.OpenSession())
{
return session.Query<Contact>().OrderBy(x => x.OrganizationName)
.Skip((forPage - 1) * rowsPerPage).Take(rowsPerPage);
}
}
}
问题是这会导致“无法解析属性:OrganizationName”错误。看起来我可以使用公式映射这些字段,但之后我最终会为已经加入我的查询的表上的每个字段进行子选择。或者,我可以使用公共getter包装Contact的组织,并将我的查询更改为OrderBy(x =&gt; x.Organization.Name)。这让我得到了德米特法则的违反。
我是否偏离轨道?我该怎么办呢?
已编辑以显示分页
答案 0 :(得分:0)
您不能在查询中使用非映射属性。 NHibernate应该如何知道如何为它创建SQL条件?在你的情况下它可能很容易,但是如果你在该属性中调用方法或某些复杂的逻辑会怎么样?
所以是的,你至少需要一个公共的getter属性。
或者,在内存中进行排序(在NHibernate执行查询之后)。