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