質問

3つのテーブルがあります:

  • パーツ Name :内部名、 Active :bool
  • 言語:言語のリスト(英語、フランス語、ドイツ語、...)
  • PartsTranslations RealName および他の2つのテーブルのID。

部品のリストを取得して、内部の 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º質問-最終的なクエリ(高価なクエリ)のパフォーマンスはどうですか?

ありがとう

役に立ちましたか?

解決

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パラメーターは必要ありません。

他のヒント

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;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top