У меня есть следующие объекты
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. Но у меня нет возможности ограничить его просмотром только тех тегов, что в этом документе есть не все теги.
Есть ли какие-нибудь примеры, где я могу увидеть, как я могу сделать что-то подобное?
EXISTS
, а неIN
илиJOIN
, 2) выполнениеX IN (select Id from T where Id IN (...))
«почти» то же самое, что выполнениеX IN (...)
и 3) использованиеJOIN
для выполнения медленного действия, следует использоватьEXIST
. 13.11.2014