Присоединение к подзапросу nhibernate QueryOver на объединенном IsLike - PullRequest
3 голосов
/ 05 ноября 2011

Я новичок в nHibernate и QueryOver, и у меня возникли проблемы с переписыванием некоторых sql в QueryOver в C #. Может кто-нибудь мне помочь? Моя конкретная проблема заключается в том, что я присоединяюсь к подзапросу с помощью дизъюнкции, содержащей IsLike с объединенным значением, и не могу найти правильный способ сделать это.

Вот упрощенная версия задействованных таблиц базы данных и некоторые примеры данных:

create table Rating (
  id          INT,
  description VARCHAR(20),
  value       INT
);

create table Category (
  id            INT,
  categoryName  VARCHAR(20),
  parentId      INT,
  path          VARCHAR(100)
);

create table Movie (
  id              INT,
  categoryId      INT,
  title           VARCHAR(50),
  description     VARCHAR(500),
  editorsRatingId INT,
  usersRatingId   INT
);

insert into Rating values (34, 'Bad', 1);
insert into Rating values (35, 'Good', 5); 
insert into Rating values (36, 'Excellent', 9);

insert into Category values (1, 'Sports', null, 'SPO');
insert into Category values (2, 'Baseball', 1, 'SPO/BAB');
insert into Category values (3, 'Motor', 1, 'SPO/MOT');
insert into Category values (4, 'Documentary', null, 'DOC');
insert into Category values (5, 'Nature', 4, 'DOC/NAT');
insert into Category values (6, 'Political', 4, 'DOC/POL');
insert into Category values (7, 'Constructions', 4, 'DOC/CON');

insert into Movie values (1, 3, 'A motor sports title', 'A motor sports description', 35, 34);
insert into Movie values (2, 2, 'A baseball title', 'A baseball description', 35, 36);
insert into Movie values (3, 5, 'A nature documentary', 'A nature documentary description', 36, 35);
insert into Movie values (4, 7, 'A construction documentary', 'A construction documentary description', 35, 36);

Вот SQL, который я хочу построить с помощью QueryOver:

--Try running this with 0, 1 and 4 as :parentId
select c1.id, c1.categoryName, max(subQuery.eRating) as eRating1, max(subQuery.uRating) as uRating1
from Category c1
  join (
    select c.path, max(editorsRating.value) as eRating, max(usersRating.value) as uRating
    from Category c
      join Movie m on (m.categoryId = c.id)
      join Rating editorsRating on (editorsRating.id = m.editorsRatingId)
      join Rating usersRating on (usersRating.id = m.usersRatingId)
    group by c.path
    ) as subQuery on (subQuery.path = c1.path or subQuery.path like concat(c1.path,'/%'))
where coalesce(c1.parentId, 0) = :parentId
group by c1.id, c1.categoryName 

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

Я был бы признателен, если бы кто-нибудь дал мне подсказку, особенно в части присоединения подзапроса к объединенному значению.

...