ActiveRecord Query (Замок, Производительность) - PullRequest
0 голосов
/ 26 октября 2009

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

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

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

Я сделал этот 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º вопрос- Как производительность последнего запроса (дорогой)?

Спасибо

Ответы [ 2 ]

0 голосов
/ 27 октября 2009

Я смог сделать этот запрос в 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.

0 голосов
/ 26 октября 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;
...