【问题标题】:ActiveRecord Query (Castle, Performance)ActiveRecord 查询(城堡、性能)
【发布时间】:2009-10-28 16:15:39
【问题描述】:

我有 3 张桌子:

  • 零件Name:内部名称,Active:bool
  • 语言:语言列表(英语、法语、德语……)
  • 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º问题-最终查询的性能如何(昂贵的)?

谢谢

【问题讨论】:

  • 如果这对您有用的话,您可以将 Linq 与 Castle ActiveRecord 一起使用。

标签: database nhibernate pagination castle-activerecord


【解决方案1】:

我能够使用HqlBasedQuery 在 ActiveRecord 中进行此查询,因此我在此处发布答案以帮助与我处于相同情况的其他人。

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 参数。

【讨论】:

    【解决方案2】:

    我对 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;
    

    【讨论】:

    • 您的第二个查询正在运行,但我无法运行第一个查询:S ----> 列“p.name”在选择列表中无效,因为它不包含在任一聚合中函数或 GROUP BY 子句。我怎样才能让它运行?
    • 添加:GROUP BY p.id, p.name, p.active 它正在工作:) 现在只需要知道如何在 activerecord 中运行它:P 谢谢 Lukas
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    • 2021-05-16
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多