2009-10-25 37 views
0

我有3个表:ActiveRecord的查询(城堡,性能)

  • Name:内部名称,Active:布尔
  • 语言:语言(英语,法语,德语名单,...)
  • PartsTranslationsRealName和其他2个表的Id。

我想获得的列表告诉我内部nameactive状态多少翻译缺失(共郎减法做翻译)

我做了这个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ºquestion-最终查询(昂贵的)的性能如何?

感谢

+0

如果对你有用,你可以使用Linq和Castle ActiveRecord。 – 2009-10-29 09:49:10

回答

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 2009-10-25 22:42:02

+0

加入:GROUP BY p.id,p.name,p.active它的工作:)现在只需要知道如何在activerecord中运行这个:P Thanks Lukas – Dryadwoods 2009-10-25 23:03:00