Запрос ActiveRecord (замок, производительность)

У меня есть 3 таблицы:

  • Части: Name: внутреннее имя, Active: bool
  • Языки: список языков (английский, французский, немецкий, ....)
  • PartsTranslations: RealName и идентификаторы двух других таблиц.

Я хотел бы получить список Частей с указанием внутреннего статуса name, active и количества недостающих переводов (общее количество выполненных переводов за вычетом языков)

Я сделал этот SQL-запрос, который дает мне то, что мне нужно (я не знаю, лучший ли это способ сделать это или нет, но он работает):

SELECT 
    parts1.name, 
    parts1.active, 
    (
        (SELECT count(lang.id) 
            FROM languages AS lang) 
        - 
        (SELECT count(trans.id)
            FROM parts AS parts2 
            INNER JOIN partstranslations as trans
            ON parts2.id = trans.partid
            WHERE parts2.id = parts1.id)        
    )
from parts as parts1;

1º вопрос- Как я могу сделать этот запрос с помощью Castle ActiveRecord?

Вопрос 2 – Какова производительность последнего запроса (дорогого)?

Спасибо


person Dryadwoods    schedule 25.10.2009    source источник
comment
Вы можете использовать Linq с Castle ActiveRecord, если это полезно для вас.   -  person Michael Maddox    schedule 29.10.2009


Ответы (2)


Я смог сделать этот запрос в ActiveRecord, используя HqlBasedQuery, поэтому я публикую здесь ответ, чтобы помочь другим в той же ситуации, что и я.

HqlBasedQuery query = new HqlBasedQuery(typeof(Part),
 @"
    SELECT                     
        par.Id, 
        par.Name, 
        par.Active,                                         
        (SELECT count(*) - count(trans) FROM Language)                                                            
    FROM Part par
        LEFT JOIN par.PartsTranslations trans
    GROUP BY par.Id, par.Name, par.Active, trans.Part
    ");
query.SetQueryRange(startId, currentPageSize);

var results = from object[] summary in
              (ArrayList)ActiveRecordMediator.ExecuteQuery(query)
          select new PartProjection
          {
              Id = (int)summary[0],
              Name = (string)summary[1],
              Active = (bool)summary[2],
              TransMissing = (long)summary[3]                                       
          };

У меня также есть разбиение на страницы по этому запросу, и это также дает мне усиленные типизированные объекты PartProjection. Этот класс НЕ должен иметь какой-либо параметр ActiveRecord.

person Dryadwoods    schedule 26.10.2009

Я не могу помочь с ActiveRecord, но этот запрос должен работать лучше, чем запрос с коррелированным подзапросом.

SELECT
    p.name,
    p.active, 
    (SELECT count(*) FROM languages) - count(pt.divid)
FROM
    Parts p
    LEFT JOIN PartsTranslations pt ON p.id=pt.divid
GROUP BY p.id, p.name, p.active

Или, если вы хотите использовать коррелированный подзапрос, вам не нужно снова выбирать в нем из Parts:

SELECT 
    p.name, 
    p.active, 
    (SELECT count(*) FROM Languages) - 
    (SELECT count(*) FROM PartsTranslations WHERE divid = p.id)            
FROM Parts p;
person Lukáš Lalinský    schedule 25.10.2009
comment
Ваш второй запрос работает, но я не могу выполнить первый: S ----> Столбец «p.name» недействителен в списке выбора, поскольку он не содержится ни в агрегатной функции, ни в предложении GROUP BY. Как я могу заставить его работать? - person Dryadwoods; 26.10.2009
comment
Добавление: GROUP BY p.id, p.name, p.active работает :) Теперь просто нужно знать, как запустить это в activerecord: P Спасибо, Лукас - person Dryadwoods; 26.10.2009