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

Nhibernate, где существует queryOver

У меня есть следующие объекты

public class Document
{
    public Guid Id { get; set; }
    public ISet<Tag> Tags { get; set;}
    ...
}

public class Tag 
{
    public Guid Id { get; set;} 
}

Это отношение многие ко многим, но у меня нет промежуточного объекта DocumentTag. Я пытаюсь использовать синтаксис QueryOver для возврата всех документов со всеми наборами тегов. Вот что у меня есть до сих пор.

Guid[] tagsThatMustMatch = ...;
var result = Session.QueryOver<Document>()
               .WithSubquery
               .WhereExists(QueryOver.Of<Tag>().Where(t => tagsThatMustMatch.Contains(t.Id))
               .List()

У меня возникли проблемы с выражением требования. Я понимаю, что мне нужно динамически построить запрос, который будет иметь WhereExists для каждого тега, который должен совпадать. Эти WhereExists должны быть исправлены. Другая проблема, с которой я столкнулся, заключается в том, что метод WhereExists должен принимать DetachedQuery. Но у меня нет возможности ограничить его просмотром только тех тегов, что в этом документе есть не все теги.

Есть ли какие-нибудь примеры, где я могу увидеть, как я могу сделать что-то подобное?

21.01.2013

Ответы:


1

Использование IN – нет необходимости настраивать определение сущности(й)

Давайте сначала объявим ваш подзапрос таким образом:

Guid[] tagsThatMustMatch = ...;

var subQuery = QueryOver.Of<Tag>()
 .WhereRestrictionOn(t => t.Id).IsIn(tagsThatMustMatch)
  .Select(t => t.Id); // tag ID projection

Отсоединив критерии, мы можем использовать их в синтаксисе QueryOver следующим образом:

var query = session.QueryOver<Document>()
  .JoinQueryOver<Tag>(d => d.Tags)
  .Where(Subqueries.PropertyIn("Id", subQuery.DetachedCriteria)) // Tag.Id
  // .TransformUsing(Transformers.DistinctRootEntity) // distinct
  ; 

ПРОДЛЕВАТЬ:

Использование EXISTS — потребуется корректировка нашей модели предметной области.

Как отметил в своем комментарии Диего Янчич, EXISTS может быть более эффективным... но только если есть ссылка из с Tag по Document

Это может быть либо отсылка

public class Tag 
{
    public Guid Id { get; set;} 
    public Document Document { get; set; }
}

или, по крайней мере, Guid, представляющий идентификатор документа

public class Tag 
{
    public Guid Id { get; set;} 
    public Guid DocumentId { get; set; }
}

Предположим первое, тогда мы можем использовать такой подзапрос

Guid[] tagsThatMustMatch = ...;

// Essential alias of the parent Document
Document document = null;

var subQuery = QueryOver.Of<Tag>()
 .Where(t => t.Document.Id == document.Id) // or t.DocumentId = document.Id
 .WhereRestrictionOn(t => t.Id).IsIn(tagsThatMustMatch)
 .Select(t => t.Id); // tag ID projection

Это единственный способ, при котором подзапрос будет правильно возвращать значение true только для тегов, относящихся к документу. Существующий запрос будет выглядеть так

var query = session
    .QueryOver<Document>(() => document) // alias used in subquery
    .WithSubquery                        // needed to filter by parent id
        .WhereExists(subQuery)
    ...
21.01.2013
  • -1, потому что есть 3 проблемы: 1) он запрашивает EXISTS, а не IN или JOIN, 2) выполнение X IN (select Id from T where Id IN (...)) «почти» то же самое, что выполнение X IN (...) и 3) использование JOIN для выполнения медленного действия, следует использовать EXIST. 13.11.2014
  • @DiegoJancic, я расширил свой ответ предложенным вами подходом. Это не так тривиально, потому что мы должны расширить модель предметной области, чтобы это произошло, но теперь это будет (как вы упомянули) лучше SQL-запроса. Большое спасибо за комментарий, почему проголосовали против. Я восхищаюсь тем, что вы добавили комментарий! Спасибо за помощь в улучшении 14.11.2014
  • Спасибо. Отличный ответ. Изменено на +1. 14.10.2015
  • Новые материалы

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

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

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

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

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

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

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