Nano Hash - криптовалюты, майнинг, программирование

NHibernate многие ко многим приводит ко многим запросам

Я разрабатываю систему закладок в 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 закладки):

Пример с NHibernate Profiler (3 закладки)

27.08.2013

Ответы:


1

Вы можете использовать CreateAlias для быстрого получения закладок, и это также позволит вам копать еще один слой глубже, чтобы указать, как вы хотите получать теги.

ICriteria criteriaQuery = SessionFactory.GetCurrentSession()
    .CreateCriteria(typeof(Tag))
    .CreateAlias("Bookmarks", "b", JoinType.LeftOuterJoin)
    .CreateAlias("b.Tags", "bt", JoinType.LeftOuterJoin)
    .CreateAlias("User", "User")
    .Add(Restrictions.Eq("Title", title))
    .Add(Restrictions.Eq("User.Username", username))
    .SetResultTransformer(Transformers.DistinctRootEntity);

Изменить: исправлен запрос. Извините. По-видимому, SetFetchMode работает только для отношений непосредственно вне корневого объекта запроса. Замена его на CreateAlias решает проблему.

Со всеми этими левыми внешними соединениями с коллекциями вам нужно будет немного изменить свои сущности и обновить сопоставления, чтобы предотвратить появление дублирующихся записей в коллекциях. Вместо ICollection<T> используйте ISet<T> из пространства имен Iesi.Collections.Generic и измените сопоставления, чтобы использовать <set/> вместо <bag/>.

28.08.2013
  • Это приводит к почти такому же запросу и не решает отложенную загрузку для каждой закладки. 28.08.2013
  • Это работает спасибо. Я использую свободное отображение с AsSet(), и это прекрасно работает с ICollection‹T›. Несмотря на то, что результаты уникальны, результаты в запросе не являются уникальными. Значит, пейджинг будет затруднен, верно? 28.08.2013
  • Да, пейджинг будет сложным, но выполнимым. Вам нужно будет использовать подзапросы или разделить его на два запроса: один запрос для определения страницы тегов для извлечения, другой запрос для быстрого извлечения других записей, связанных с этими тегами. 28.08.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..