NHIbernate: Получить дочерний объект, отфильтрованный по свойству родительского объекта

Я использую Fluent NHibernate для сопоставления своих сущностей.

Мои занятия:

public class Email
{
    public virtual int Id           { get; protected set; }
    public virtual string Status    { get; set; }
    public virtual string Login     { get; set; }
    public virtual string Password  { get; set; }
    public virtual Profile Profile  { get; set; }
    public virtual DateTime Created { get; set; }
}

public class Profile
{
    public virtual int Id             { get; protected set; }
    public virtual string ProfilePath { get; set; }
    public virtual Proxy Proxy        { get; set; }
    public virtual DateTime Created   { get; set; }
}

public class Proxy
{
    public virtual int Id           { get; protected set; }
    public virtual string Status    { get; set; }
    public virtual string Ip        { get; set; }
    public virtual string Port      { get; set; }
    public virtual string Type      { get; set; }
    public virtual DateTime Created { get; set; }
}

EntityMaps:

public class EmailMap : ClassMap<Email>
{
    public EmailMap()
    {
        Id(c => c.Id);
        Map(c => c.Status).Not.Nullable();
        Map(c => c.Login).Not.Nullable();
        Map(c => c.Password).Not.Nullable();
        Map(c => c.Created).Not.Nullable();
        References(c => c.Profile).Cascade.All();
    }
}

public class ProfileMap : ClassMap<Profile>
{
    public ProfileMap()
    {
        Id(c => c.Id);
        Map(c => c.ProfilePath).Not.Nullable();
        Map(c => c.Created).Not.Nullable();
        References(c => c.Proxy).Cascade.All();
    }
}

public class ProxyMap : ClassMap<Proxy>
{
    public ProxyMap()
    {
        Id(c => c.Id);
        Map(c => c.Status).Not.Nullable();
        Map(c => c.Ip).Not.Nullable();
        Map(c => c.Port).Not.Nullable();
        Map(c => c.Type).Not.Nullable();
        Map(c => c.Created).Not.Nullable();
    }
}

Каждое письмо имеет только один профиль. Каждый профиль имеет только один прокси. Я хочу, чтобы прокси-класс был независимым (я имею в виду, что я не хочу его модифицировать или адаптировать для другого проекта), и поэтому я не хочу отображать в родительские объекты, такие как Profile, Email. Потому что эти коллекции родительского объекта могут быть бесполезны в другом проекте. Вот почему я установил отношения "в одну сторону" (пожалуйста, поправьте меня, если я ошибаюсь или неправильно понимаю). Поэтому я не могу получить электронное письмо от дочернего профиля (то же самое с профилем и прокси).

Теперь я пытаюсь написать метод с использованием QueryOver, который возвращает прокси, которые не использовались с "пользовательского интервала" (ввод). Так что в случае электронной почты, я должен получить все электронные письма, которые были созданы после "ввода", получить их профиль, получить их прокси. И на последнем шаге обратный отбор. Поэтому я получаю прокси, которые не использовались в почтовом проекте в течение определенного промежутка времени. Я понял это с помощью ISQLQuery:

SELECT *
FROM proxy
WHERE proxy.Id
NOT IN
(
    SELECT profile.Proxy_id
    JOIN profile ON email.Profile_id = profile.id
    WHERE email.Created > NOW() - INTERVAL 1 DAY
);

Я не уверен насчет "одностороннего" отношения.

Я думаю, что это делает сущность универсальной. Я имею в виду, что это может быть полезно для многих других проектов. Я не хочу добавлять родительскую коллекцию (Profile) для child (Proxy) каждый раз, когда создаю новый проект. Например, мне нужно получить прокси для других классов (не для электронной почты). И я использую тот же метод из моего ProxyRepository.

Входные параметры конечно будут содержать данные о родительской сущности (поскольку родительская сущность содержит свойство).

Извините за мой английский.

1 ответ

Как насчет

var proxies = session.QueryOver<Email>.Where(email => email.Created < DateTime.Now() - TimeSpan.FromDays(1)).Select(email => email.Profile.Proxy);
Другие вопросы по тегам