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 個のクエリが取得されます。1 つまたは 2 つのクエリでこれを行うことは可能ですか?
NHibernate Profiler の例 (3 つのブックマーク):