Я разрабатываю систему закладок в ASP.NET MVC и использую NHibernate для запросов к базе данных.
У меня есть отношения многие ко многим:
- Закладка может иметь много тегов
- У тега может быть много закладок
Модели:
public class Bookmark
{
public virtual string Title { get; set; }
public virtual string Link { get; set; }
public virtual User User { get; set; }
public virtual ICollection<Tag> Tags { get; set; }
}
public class Tag
{
public virtual string Title { get; set; }
public virtual string Description { get; set; }
public virtual User User { get; set; }
public virtual ICollection<Bookmark> Bookmarks { get; set; }
}
Я хочу получить тег, прокрутить его закладки и для каждой закладки прокрутить его теги. Для этого я использовал это:
public Tag GetTagByTitle(string username, string title)
{
ICriteria criteriaQuery = SessionFactory.GetCurrentSession()
.CreateCriteria(typeof(Tag))
.SetFetchMode("Bookmarks", FetchMode.Eager)
.CreateAlias("User", "User")
.Add(Restrictions.Eq("Title", title))
.Add(Restrictions.Eq("User.Username", username));
IList<Tag> tags = criteriaQuery.List<Tag>();
Tag tag = tags.FirstOrDefault();
return tag;
}
Это дает мне тег со своими закладками. Однако для каждой закладки автоматически выполняется другой запрос для получения ее тегов (ленивая загрузка?). Итак, если у меня есть 10 закладок, я получаю 1 + 10 запросов. Можно ли сделать это с помощью одного или двух запросов?
Пример с NHibernate Profiler (3 закладки):