2009-10-25 3 views
0

Я 3 таблицы:ActiveRecord запросов (замок, Performance)

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

Я хотел бы получить список частей рассказывал мне внутренние 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º question- Как это сделать, используя Castle ActiveRecord?

2º question- Как выполняется окончательный запрос (дорогой)?

Благодаря

+0

Вы можете использовать Linq с Castle ActiveRecord, если это полезный вариант для вас. –

ответ

0

Я был в состоянии сделать этот запрос в 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]          
      }; 

Я также пагинацию сделал на этот запрос, и это также даст мне stronged напечатал PartProjection объектов. Этот класс НЕ должен иметь какой-либо параметр ActiveRecord.

-1

Я не могу помочь с 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; 
+0

Ваш второй запрос работает, но я не могу запустить первый: S ----> Столбец «p.name» недопустим в списке выбора, потому что он не содержится ни в агрегатной функции, ни в предложении GROUP BY. Как я могу запустить его? – Dryadwoods

+0

Добавление в: GROUP BY p.id, p.name, p.active это работает :) Теперь просто нужно знать, как запустить это в activerecord: P Спасибо Lukas – Dryadwoods

Смежные вопросы