Учитывая простой механизм блога, в котором есть сообщения и теги, связанные с сообщениями. В базе данных: 2 таблицы: Post
и Tag
, также PostTag
таблица для отношений «многие ко многим».Найти строки, в которых дочерняя коллекция содержит все элементы списка
У меня есть список тегов, и я хочу, чтобы найти все сообщения, которые имеют все эти теги (так .IsIn()
не работает здесь)
Вопрос: как я могу добиться этого с помощью NHibernate? (в идеале с использованием метода .QueryOver<>()
)
Проблема в том, что я даже не знаю с чего начать и как ее реализовать в чистом SQL. У меня есть 2 идеи:
- Получить все сообщения, а затем фильтровать их с помощью LINQ (т.е. с
.IsSupersetOf()
функции) - При использовании SQL
WHERE EXISTS
для каждого элемента в списке
Но я верю, что есть более элегантный способ
Таблицы структура
CREATE TABLE Post (
Id INT PRIMARY KEY,
Title NVARCHAR(255) NOT NULL
);
CREATE TABLE Tag (
Id INT PRIMARY KEY,
Tag NVARCHAR(50) NOT NULL
);
CREATE TABLE PostTag (
PostId INT NOT NULL REFERENCES Post(Id),
TagId INT NOT NULL REFERENCES Tag(Id)
);
INSERT INTO Post(Id, Title) VALUES (1, 'Post A');
INSERT INTO Post(Id, Title) VALUES (2, 'Post B');
INSERT INTO Post(Id, Title) VALUES (3, 'Post C');
INSERT INTO Tag(Id, Tag) VALUES (1, 'tagA');
INSERT INTO Tag(Id, Tag) VALUES (2, 'tagB');
INSERT INTO PostTag (PostId, TagId) VALUES (1, 1);
INSERT INTO PostTag (PostId, TagId) VALUES (2, 2);
INSERT INTO PostTag (PostId, TagId) VALUES (3, 1);
INSERT INTO PostTag (PostId, TagId) VALUES (3, 2);
И я хочу, чтобы получить сообщение с идентификатором 3 по заданному списку тегов ID: (1, 2)
Я ошибаюсь, когда я говорю .Contains не будет работать? –
@TomB. Это определенно работает, но после определенного предела (я считаю, ~ 10 000) обычно лучше вставлять в таблицу temp. Но да, генерация SQL работает как для EF, так и для linq2sql. Решение SQL - это унаследованная версия того, что linq2sql генерирует из LINQ. Я бы предположил, что nhibernate также поддерживает его или, по крайней мере, версию. Это очень важно для запроса данных. – Rob