У меня есть класс «многие к одному» со своим родителем. Я хотел бы раскрыть свойства родителя через дочерний элемент, не раскрывая его напрямую. Я также хотел бы запросить и упорядочить по этим свойствам.
Классы
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). Это оставляет меня с нарушением закона Деметры.
Я не в курсе? Как мне справиться с этим?
отредактировано для отображения подкачки