Запросы на свойства частной ссылки - PullRequest
0 голосов
/ 27 июня 2011

У меня есть класс «многие к одному» со своим родителем. Я хотел бы раскрыть свойства родителя через дочерний элемент, не раскрывая его напрямую. Я также хотел бы запросить и упорядочить по этим свойствам.

Классы

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; } }
}

Mapping

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». Похоже, я мог бы сопоставить эти поля с формулой, но тогда я бы выбрал суб-выбор для каждого поля в таблице, которая уже включена в мой запрос. В качестве альтернативы я мог бы обернуть организацию Контакта общедоступным геттером и изменить свой запрос на OrderBy (x => x.Organization.Name). Это оставляет меня с нарушением закона Деметры.

Я не в курсе? Как мне справиться с этим?

отредактировано для отображения подкачки

1 Ответ

0 голосов
/ 27 июня 2011

Вы не можете использовать не сопоставленные свойства в запросах.Как NHibernate должен знать, как создать для него условие SQL?В вашем случае это может быть легко, но что, если у вас будет вызов метода или какой-либо сложной логики в этом свойстве?

Так что да, вам нужно по крайней мере публичное свойство getter.

Или же выполнить сортировку в памяти (после того, как NHibernate выполнил запрос).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...