查询私有引用的属性

时间:2011-06-27 15:00:44

标签: nhibernate fluent-nhibernate

我有一个与父母一对一的课程。我希望通过子项公开父级的属性,而不直接暴露父级。我也想通过这些属性查询和订购。

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)。这让我得到了德米特法则的违反。

我是否偏离轨道?我该怎么办呢?

已编辑以显示分页

1 个答案:

答案 0 :(得分:0)

您不能在查询中使用非映射属性。 NHibernate应该如何知道如何为它创建SQL条件?在你的情况下它可能很容易,但是如果你在该属性中调用方法或某些复杂的逻辑会怎么样?

所以是的,你至少需要一个公共的getter属性。

或者,在内存中进行排序(在NHibernate执行查询之后)。